2009-06-11 12 views
4

Ich habe vor Jahren eine .NET-Anwendung erstellt, ohne zu viel über das Dateiformat nachzudenken: Es benutzt einen Soap-Formatierer, um unsere große Hierarchie von Objekten zu serialisieren. Es war sehr einfach zu machen, und deshalb dachte ich nicht viel darüber nach.Wie wähle ich ein Dateiformat?

Ich versuche jetzt, ein optimales Dateiformat unter Berücksichtigung des folgenden Problems zu finden: Wenn eine Datei gespeichert wird, wird sie letztendlich in ein Byte-Array konvertiert und über das Kabel an eine Datenbank zum Speichern gesendet. Dies ist ein großes Problem, da Sie alle Ihre Objekte im Speicher haben, dann mehr Speicher für den Serializer zuweisen und dann noch mehr Speicher für das Byte-Array zuweisen. Sogar Objektgraphen mit einer bescheidenen Größe verbrauchen viel Speicherplatz, um die Datei zu speichern.

Ich bin mir nicht sicher, wie dies zu verbessern, sowohl aus Sicht Dateiformat, sondern auch potenziell aus der Sicht des Algorithmus (Objekte -> Strom -> Byte-Array)

UPDATE: Ich würde Ich habe das Byte-Array immer gezippt, bevor ich es über die Leitung gesendet habe. Obwohl das ein guter Rat ist, wurde es bereits in meiner Anwendung implementiert.

Ich habe von Soap zu binärer Serialisierung konvertiert, und das hat einen großen Unterschied gemacht: Unsere Dateien sind etwa 7x kleiner als zuvor. (Ihre Laufleistung kann natürlich variieren).

Antwort

4

Wenn Sie eine effiziente Serialisierung benötigen und sich nicht darum kümmern, ob sie als Binärformat serialisiert ist, verwenden Sie einfach die Standard-Binärserialisierung in .NET. Sie können Ihre serialisierbaren Typen einfach mit dem [Serializable] -Attribut dekorieren und den BinaryFormatter verwenden, um Ihre Objekte zu byte [] zu serialisieren.

3

eine sehr schnelle Lösung, wenn Sie es nicht versucht haben. Es wird den Overhead nicht komplett reduzieren, aber es wird helfen.

Wenn Sie Ihre Objekte serialisieren, verwenden Sie Attribute anstelle von Knoten. Es gibt viel verschwendeten Raum mit Knoten. Sie können dies leicht erreichen, indem Sie über der Eigenschaft/dem Feld ein [XmlAttribute] -Tag hinzufügen.

Referenz-Link: http://msdn.microsoft.com/en-us/library/2baksw0z(VS.71).aspx

1

Sie auch mit einem Druck/Reißverschluss Strom versuchen könnte, glaube ich aus dem Gedächtnis SharpZipLib können Sie komprimierte Streams erstellen.

0

Warum nicht die Anwendung von XML zu einem JSON verschieben? Es gibt eine Reihe von Bibliotheken, die JSON in .NET serialisieren/deserialisieren können.

0

Ich habe LZMA für die Komprimierung für Daten verwendet, die ich in der Datenbank speichern. Zum Beispiel Dinge von 36.000 bis 6000. Es ist wirklich einfach zu bedienen, und Sie müssen die Daten nicht nur als Binärdatei gespeichert haben, es könnte auch eine Zeichenfolge sein.

3

BinaryFormatter + DeflateStream = Compressed Persisted Objekte

using System; 
using System.IO; 
using System.IO.Compression; 
using System.Runtime.Serialization.Formatters.Binary; 

namespace CompressedSerialized 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var obj1 = new MyObject() { Prop1 = "p1", Prop2 = "p2" }; 
      MyObject obj2 = null; 
      var bin = new BinaryFormatter(); 
      byte[] buffer = null; 

      using (var ms = new MemoryStream()) 
      { 
       using (var zip = new DeflateStream(ms, CompressionMode.Compress)) 
       { 
        bin.Serialize(zip, obj1); 
        zip.Flush(); 
       } 
       buffer = ms.ToArray(); 
      } 

      using (var ms = new MemoryStream(buffer)) 
      using (var unzip = new DeflateStream(ms, CompressionMode.Decompress)) 
      { 
       var des = bin.Deserialize(unzip); 
       obj2 = des as MyObject; 
      } 

     } 
    } 

    [Serializable] 
    public class MyObject 
    { 
     public string Prop1 { get; set; } 
     public string Prop2 { get; set; } 
    } 
} 
Verwandte Themen