Применяет ли BinaryFormatter какое-либо сжатие? - PullRequest
7 голосов
/ 27 августа 2009

Когда .NET BinaryFormatter используется для сериализации графа объектов, применяется ли какой-либо тип сжатия?

Я спрашиваю в контексте того, должен ли я беспокоиться о том, что граф объектов имеет много повторяющихся строк и целых чисел.

Редактировать - Подождите, если строки интернированы в .NET, вам не нужно беспокоиться о повторяющихся строках, верно?

Ответы [ 2 ]

10 голосов
/ 27 августа 2009

Нет, он не обеспечивает сжатие, но вы можете сжать вывод самостоятельно, используя тип GZipStream.

Edit: Mehrdad имеет замечательный пример этой техники в своем ответе на Как сжать экземпляр объекта .net с помощью gzip .

Редактировать 2: Строки можно интернировать, но это не означает, что каждая строка интернирована . Я бы не делал никаких предположений о том, как или почему CLR принимает решение о интернировании строк, поскольку это может изменяться (и изменялось) от версии к версии.

5 голосов
/ 10 мая 2011

Нет, это не так, но ...

Я только что добавил поддержку GZipStream для своего приложения сегодня, чтобы я мог поделиться некоторым кодом здесь;

Сериализация:

using (Stream s = File.Create(PathName))
{
    RijndaelManaged rm = new RijndaelManaged();
    rm.Key = CryptoKey;
    rm.IV = CryptoIV;
    using (CryptoStream cs = new CryptoStream(s, rm.CreateEncryptor(), CryptoStreamMode.Write))
    {
        using (GZipStream gs = new GZipStream(cs, CompressionMode.Compress))
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(gs, _instance);
        }
    }
}

Десериализация:

using (Stream s = File.OpenRead(PathName))
{
    RijndaelManaged rm = new RijndaelManaged();
    rm.Key = CryptoKey;
    rm.IV = CryptoIV;
    using (CryptoStream cs = new CryptoStream(s, rm.CreateDecryptor(), CryptoStreamMode.Read))
    {
        using (GZipStream gs = new GZipStream(cs, CompressionMode.Decompress))
        {
            BinaryFormatter bf = new BinaryFormatter();
            _instance = (Storage)bf.Deserialize(gs);
        }
    }
}

ПРИМЕЧАНИЕ: если вы используете CryptoStream, очень важно правильно (не) зашифровать и (де) зашифровать таким образом, потому что вы захотите потерять энтропию ДО того, как шифрование создаст шум из ваших данных.

...