我已更新代码,旧版本存在问题.
这是一个序列化和压缩的函数,反之亦然.
public static byte[] SerializeAndCompress(object obj) {
using (MemoryStream ms = new MemoryStream()) {
using (GZipStream zs = new GZipStream(ms, CompressionMode.Compress, true)) {
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(zs, obj);
}
return ms.ToArray();
}
}
public static object DecompressAndDeserialze(byte[] data) {
using (MemoryStream ms = new MemoryStream(data)) {
using (GZipStream zs = new GZipStream(ms, CompressionMode.Decompress, true)) {
BinaryFormatter bf = new BinaryFormatter();
return bf.Deserialize(zs);
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是如何使用它.
[Serializable]
class MyClass
{
public string Name { get; set; }
}
static void Main(string[] args) {
MyClass myClassInst = new MyClass();
myClassInst.Name = "Some Data";
byte[] data= SerializeAndCompress(myClassInst);
MyClass desInst = (MyClass)DecompressAndDeserialze(data);
}
Run Code Online (Sandbox Code Playgroud)
但压缩有一个问题.请记住,上面的示例对象是序列化为153字节,但压缩版本是266字节,原因是如果具有较少数据的小对象,则gzip头信息和压缩头将至少占用120字节.因此,如果你的对象足够大而不是压缩它们,如果它们只需要300字节左右就不需要压缩它们.您可以检查压缩率,看看您是否反对甚至需要压缩.
尝试压缩大量数据的另一个建议总是会对单个压缩对象提供更好的压缩.