O BinaryFormatter aplica alguma compactação?
-
20-09-2019 - |
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?
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.