7 Stimmen

Wendet BinaryFormatter eine Komprimierung an?

Wenn die .NET BinaryFormatter zur Serialisierung eines Objektgraphen verwendet wird, wird irgendeine Art von Komprimierung angewendet?

Ich frage im Zusammenhang mit der Frage, ob ich mir Sorgen darüber machen sollte, dass der Objektgraph viele sich wiederholende Zeichenketten und ganze Zahlen enthält.

Editar - Moment mal, wenn Strings in .NET interniert sind, muss man sich doch keine Sorgen um wiederholte Strings machen, oder?

10voto

Andrew Hare Punkte 332190

Nein, es bietet keine Komprimierung, aber Sie können die Ausgabe selbst komprimieren, indem Sie die GZipStream Typ.

Bearbeiten: Mehrdad hat ein wunderbares Beispiel für diese Technik in seiner Antwort auf Komprimieren einer .net-Objektinstanz mit gzip .

Bearbeiten 2: Streicher kann interniert werden, aber das bedeutet nicht, dass jeder String est interniert. Ich würde keine Vermutungen darüber anstellen, wie oder warum die CLR entscheidet, Zeichenketten zu internieren, da sich dies von Version zu Version ändern kann (und geändert hat).

5voto

Daniel Mošmondor Punkte 19346

Nein, tut es nicht, aber...

Ich habe gerade GZipStream-Unterstützung für meine Anwendung heute hinzugefügt, so kann ich einige Code hier teilen;

Serialisierung:

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

Deserialisierung:

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

HINWEIS: Wenn Sie CryptoStream verwenden, ist es wichtig, dass Sie das (Ent-)Zippen und (Ent-)Verschlüsseln auf diese Weise richtig verketten, denn Sie wollen Ihre Entropie verlieren, BEVOR die Verschlüsselung Rauschen in Ihren Daten erzeugt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X