Сжатие объекта в точечной сети - PullRequest
1 голос
/ 19 января 2010

Я хочу сжать объект в точечной сети, чтобы уменьшить его размер, а затем распаковать его в моем клиентском приложении.

Спасибо, Мринал Джайсвал

Ответы [ 4 ]

5 голосов
/ 19 января 2010

У меня обновился код, возникла проблема со старой версией.

Вот функция, которая сериализует и сжимает и наоборот.

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 байт или около того, их не нужно сжимать. Вы можете проверить степень сжатия и посмотреть, требуется ли вам даже сжатие.

Еще одно предложение: попытка сжать большую часть данных всегда даст лучшее сжатие по сравнению с отдельными объектами сжатия.

1 голос
/ 19 января 2010

Вы всегда можете GZip it.

0 голосов
/ 19 января 2010

Полагаю, вам нужно улучшить процедуру сериализации, сжимая содержащиеся в ней данные. Как только мне это понадобилось в .NET, я использовал SoapExtensions, но вы также можете использовать функциональность httpmodule, например msdn предлагаемый:

//overriding the GetWebRequest method in the Web service proxy
protected override WebRequest GetWebRequest(Uri uri)
{
  WebRequest request = base.GetWebRequest(uri);
  request.Headers.Add("Accept-Encoding", "gzip, deflate");
  return request;
}
//overriding the GetWebResponse method in the Web service proxy
protected override WebResponse GetWebResponse(WebRequest request)
{
  //decompress the response from the Web service
  return response;
}
0 голосов
/ 19 января 2010

Сериализуйте его, просто добавив следующую строку над вашим классом: (возможно, посмотрите на: http://blog.kowalczyk.info/article/Serialization-in-C.html, чтобы полностью понять, как это работает.)

[Serializable]
class Whatever
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...