У меня обновился код, возникла проблема со старой версией.
Вот функция, которая сериализует и сжимает и наоборот.
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);
}
}
}
Ниже описано, как его использовать.
[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);
}
Но есть одна загвоздка для сжатия. Помните, что вышеприведенный пример объекта сериализуется до 153 байтов, но версия сжатия составляет 266 байтов, причина в том, что если у небольших объектов меньше данных, то информация заголовка gzip и заголовок сжатия будут занимать как минимум 120 байтов. Так что, если ваш объект достаточно большой, сожмите их, если они меньше 300 байт или около того, их не нужно сжимать. Вы можете проверить степень сжатия и посмотреть, требуется ли вам даже сжатие.
Еще одно предложение: попытка сжать большую часть данных всегда даст лучшее сжатие по сравнению с отдельными объектами сжатия.