Formatter? Serialisierung mit "ISerializable"
-
Hallo Leute,
ich möchte Objekte serialisieren, die Objekte implementieren das ISerializable Interface !!
Das ganze kann ich nun mit dem "BinaryFormatter" serialiseren.. ! Aber gibt es auch andere Formatter? bspw. XML?
In .Net gibt es ja nen expliziten XmlSerializer, aber ich möchte unabhängig vom Speicherformat serialiseiren, aber irgendwie gibt es nur den "BinaryFormatter" oder bin ich jetzt Doof? Wo ist der XML Formatter etc.!?
Stream stream = File.Open("EmployeeInfo.osl", FileMode.Create); BinaryFormatter bformatter = new BinaryFormatter(); //XmlFormatter?!?!?!?! Console.WriteLine("Writing Employee Information"); bformatter.Serialize(stream, test); stream.Close();
Grüße und Danke
-
Xml wird meiner Meinung nach sogar sehr stark vom .net unterstützt.
Die Klassen XmlReader und XmlWriter sind z.B für Xml geeignet. XPath Ausdrücke werden mit den Klassen unter using system.xml.xpath unterstützt. Auch das DOM wird unter .net untersützt. Einfach mal googeln.
-
Hi das ist mir bewusst, danke!
Aber ich dachte wenn ich ISerializabe implementiere, hab ich eben außer den Binaryformatter auch nen XmlFormatter, was aber nich so ist!
Und wenn ich XmlWriter/Reader etc. verwende, kann ich eben "nur" im XML Format serialisieren.
Ich dachte ich wäre "Format"- Frei wenn ich "ISerializabe" verwende!
-
Zum Speichern in eine Datei benötigst du auf jeden Fall ein spezielles Format.
Der BinaryFormatter speichert das ganze binär mit den einzelnen Feldwerten ab, der XmlSerializer speichert dir ein XML-Dokument, welches plattformunabhängig und vorallem versionsunabhängig ist.Der BinaryFormatter eignet sich hervorragend, um Daten kompakt abzulegen, hat aber ein großes Manko: Du kannst Daten nur von Objekten mit der selben Signatur laden (sprich neue Version der Klasse mit neuen Feldern ist nicht mehr ladbar).
Der XmlSerializer stellt dir eine sehr feingranular einstellbare XML-Serialisierung bereit, die quasi jede XML-Struktur laden/speichern kann. Sehr gut, um zwischen Anwendungen Daten auszutauschen oder aber auch zwischen der selben Anwendung in verschiedenen Versionen.
ISerializable gibt dir als Interface nur an, dass die Klasse "serialisierbar" ist, eine weitere Auswirkung hat es, soweit mir bekannt, nicht.
Zudem ist nicht jede Klassenstruktur serialisierbar (Ringverweise, ...)Für weitere Formatter gibt es noch:
SoapFormatter
DataContractJsonSerializer
DataContractSerializerGrüße
Felix
-
@NullBockException
Es gibt zwei Formatter die direktISerializable
unterstützen, denBinaryFormatter
und denSoapFormatter
. Andere muss man sich ggf. selbst schreiben (oder ergoogeln, gibt sicher ein paar fertige, open-sourcige die man verwenden kann).NullBockException schrieb:
Ich dachte ich wäre "Format"- Frei wenn ich "ISerializabe" verwende!
Bist du auch - mehr oder weniger. Schreib dir nen eigenen Formatter
MasterQ32 schrieb:
ISerializable gibt dir als Interface nur an, dass die Klasse "serialisierbar" ist, eine weitere Auswirkung hat es, soweit mir bekannt, nicht.
Dann guck dir mal die Doku zu
ISerializable
an. Du musst da selbst implementieren wie das Objekt serialisiert wird, und damit die Sache funktioniert auch noch einen passenden Ctor implementieren (der dann die Deserialisierung übernimmt).
Das reine "Mascherl" mit dem man nur sagt "ja, ist serialisierbar" ist dasSerializableAttribute
.MasterQ32 schrieb:
Zudem ist nicht jede Klassenstruktur serialisierbar (Ringverweise, ...)
Auch nicht ganz richtig. Zumindest der
BinaryFormatter
kann zyklische Graphen serialisieren und korrekt wieder deserialisieren.