Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Snippet: Daten binär speichern und laden
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3061
Herkunft: Thüringen

Themenstarter:

Snippet: Daten binär speichern und laden

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
Christoph1972
myCSharp.de - Member

Avatar #avatar-2726.jpg


Dabei seit:
Beiträge: 213
Herkunft: NRW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5409

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 878
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers