Pergunta

Quando .NET's BinaryFormatter É usado para serializar um gráfico de objeto, algum tipo de compactação é aplicado?

Pergunto no contexto se devo me preocupar com o gráfico de objetos com muitas cordas repetidas e números inteiros.

Editar - Espere, se as cordas estiverem internadas no .NET, não há necessidade de se preocupar com cordas repetidas, certo?

Foi útil?

Solução

Não, ele não fornece nenhuma compressão, mas você pode comprimir a saída usando o GZipStream modelo.

Editar: Mehrdad tem um exemplo maravilhoso dessa técnica em sua resposta para Como comprimir uma instância do objeto .NET usando GZIP.

Editar 2: Cordas posso estar internado, mas isso não significa que todas as cordas é internado. Eu não faria nenhuma suposição sobre como ou por que o CLR decide estagiar strings, pois isso pode mudar (e mudar) de versão para versão.

Outras dicas

Não, não, mas ...

Acabei de adicionar suporte ao GzipStream para o meu aplicativo hoje, para que eu possa compartilhar algum código aqui;

Serialização:

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);
        }
    }
}

Deserialização:

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);
        }
    }
}

NOTA: Se você usar o CryptoStream, é meio importante que você acorrente (un) zipping e (de) penteando dessa maneira, porque você deseja perder sua entropia antes que a criptografia cria ruído a partir dos seus dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top