Laden...

Snippet: Daten binär speichern und laden

Erstellt von LaTino vor 7 Jahren Letzter Beitrag vor 7 Jahren 11.164 Views
LaTino Themenstarter:in
3.003 Beiträge seit 2006
vor 7 Jahren
Snippet: Daten binär speichern und laden

Schritt 1: Erstellt eine Klasse, und markiert sie als serialisierbar.


[Serializable]
class BinaryExample
{
    public int Height { get; set; }
    public int Width { get; set; }
    public byte[] Values { get; set; }
}

Schritt 2: Serialisieren und speichern


//using System.Runtime.Serialization.Formatters.Binary; - mscorlib.dll
var fileName = "example.bin";
using (var stream = File.Open(fileName, FileMode.Create))
{
    var binaryFormatter = new BinaryFormatter();
    binaryFormatter.Serialize(stream, example);
}

Schritt 3: Laden und deserialisieren


BinaryExample loadedExample;
using (var stream = File.Open("example.bin", FileMode.Open))
{
    var binaryFormatter = new BinaryFormatter();
    loadedExample = (BinaryExample)binaryFormatter.Deserialize(stream);
}

Schlagwörter: binär, Serialisierung, Deserialisierung, Datei speichern

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

212 Beiträge seit 2008
vor 7 Jahren

Eine kleine Ergänzung von mir....

Felder die nicht serialisiert werden können kann man so ausschließen:


[Serializable]
class BinaryExample
{
    [field: NonSerialized]
    public event PropertyChangedEventHandler PropertyChanged;

    public int Height { get; set; }
    public int Width { get; set; }
    public byte[] Values { get; set; }
}

Gruß
Christoph

5.299 Beiträge seit 2008
vor 7 Jahren

Abstrakta dazu:
BinaryFormatter erfordert als [Serializable]-attributierte Klassen, und serialisiert deren Felder, egal ob public oder private, keine Properties.
Soweit die Felder nicht als [NonSerialized] von der Serialisierung ausgenommen sind.

Das Ausnehmen von Feldern ist notwendig, wenn diese Felder Verweise darstellen auf andere, ungeeignete Objekte.
Weil Serialisierung folgt den Verweisen, und serialisiert das Verwiesene mit - Serialisierung legt also Objekt-Bäume an.
Und das führt bei ungeeigneten Objekten zu übergroßen Bäumen, bei zirkulären Verweisen auch in Endlos-Schleifen.
Oder aber das verwiesene Objekt ist gar kein serialisierbarer Datentyp, dann failts natürlich auch sofort.

Der frühe Apfel fängt den Wurm.

W
872 Beiträge seit 2005
vor 7 Jahren

Zwei Anmerkungen dazu:Die Unterstützung des Binary Serializer in DotNet Core ist zur Zeit ein offenes Issue. Binary Serializer ist langsamer als z.B. ProtocolBuffers oder MS Bond und vor allem werden keine nicht verschiedenen Versionen unterstützt - d.h. ein zusätzliches Feld macht die Dateien unbrauchbar. Deswegen würde ich davon die Finger lassen.

49.485 Beiträge seit 2005
vor 7 Jahren

Hallo zusammen,

noch eine kleine Ergänzung. In Untersch. Behandlung der Objektdaten bzgl. Modifizierer bei Serialisierung in den versch. Formaten habe ich mich näher mit den Unterschieden zwischen binärer und XML-Serialisierung beschäftigt.

herbivore