Serialisierung: Unterschied zwischen den Versionen
Justus (Diskussion | Beiträge) |
Justus (Diskussion | Beiträge) |
||
Zeile 6: | Zeile 6: | ||
: Das Objekt wird in einem Binärformat gespeichert. Es kann nur von [[.NET]] gelesen werden. | : Das Objekt wird in einem Binärformat gespeichert. Es kann nur von [[.NET]] gelesen werden. | ||
; XML Serialization | ; XML Serialization | ||
: Das Objekt wird in ein XML-Format serialisiert. Es kann | : Das Objekt wird in ein XML-Format serialisiert. Es kann dadurch relativ einfach auch auf anderen Plattformen gelesen werden. | ||
; SOAP | ; SOAP | ||
: Stadardisiertes Verfahren um Objekte zu serialisieren. Dadurch extrem einfach für andere Plattformen aber auch etwas schwerer für den Menschen zu lesen. | : Stadardisiertes Verfahren um Objekte zu serialisieren. Dadurch extrem einfach für andere Plattformen aber auch etwas schwerer für den Menschen zu lesen. |
Version vom 16. Mai 2009, 11:50 Uhr
Serialisierung[1] bezeichnet den Vorgang, ein Objekt in einen Datenstrom umzuwandeln. Dieser kann dann auf einer Festplatte gespeichert oder über ein Netzwerk übertragen werden.
Mehrere Möglichkeiten
Es gibt mehrere Möglichkeiten, ein Objekt zu serialisieren.
- Binary Serialization
- Das Objekt wird in einem Binärformat gespeichert. Es kann nur von .NET gelesen werden.
- XML Serialization
- Das Objekt wird in ein XML-Format serialisiert. Es kann dadurch relativ einfach auch auf anderen Plattformen gelesen werden.
- SOAP
- Stadardisiertes Verfahren um Objekte zu serialisieren. Dadurch extrem einfach für andere Plattformen aber auch etwas schwerer für den Menschen zu lesen.
Speichern
Um Ein Objekt zu serialisieren braucht es extrem wenig Code. Man sollte allerdings beachten, daß nur sinnvolle Daten serialisiert werden. Instanzen der Klasse File können aus offensichtlichen Gründen zum Beispiel nicht serialisiert werden.
Als erstes markiert man die zu serialisierende Klasse mit dem Attribut
[Serializable]
In der Standardeinstellung werden alle Felder und Properties dieser Klasse serialisiert, auch die privaten. Um das zu verhindern kann man diese mit dem Attribut
[NonSerialized]
markieren.
Man muss allerdings beachten, daß XmlSerializer keine privaten Felder und Properties serialisiert.
Laden
Um ein Objekt dann in eine Datei zu speichern führt man folgenden Code aus:
System.IO.FileStream fs = System.IO.File.Open("DateiName", System.IO.FileMode.Truncate);
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
bf.Serialize(fs, DateTime.Now);
Um das Objekt wieder einzulesen benutzt man folgende Zeilen:
System.IO.FileStream fs = System.IO.File.Open("DateiName", System.IO.FileMode.Open);
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
DateTime dt = (DateTime)bf.Deserialize(fs);
Man muss dabei beachten, daß die Klasse BinaryFormatter[2] wesentlich mehr kann als die Klasse XmlSerializer[3], die dafür auch auf der XBox 360 zur Verfügung steht.
Netzwerk
Man kann mit Serialisierung auch Daten über ein Netzwerk schicken. Das Prinzip ist das gleiche, da die Formatter auf Streams arbeiten. Was für einen Stream man nimmt ist ihnen egal. Für Netzwerkfunktionalität bieten sich entweder die speziellen XNA-Klassen dafür an, oder man schreibt die Funktionalität selbst. Dies ist flexibler und man braucht keinen XBox-Live-Account. Dafür funktioniert sie auf der XBox nicht.
Die nötigen Klassen finden sich im Namespace
System.Net.Sockets
Hier ein kleines Beispiel für einen Server, der einen String entgegen nimmt.
TcpListener listener = new TcpListener(11111);
listener.Start();
using (var client = listener.AcceptTcpClient())
{
Stream s = client.GetStream();
BinaryFormatter bf = new BinaryFormatter();
String str = (String)bf.Deserialize(s);
Console.WriteLine(str);
Console.ReadLine();
}
listener.Stop();
und hier der passende Client
using (TcpClient client = new TcpClient("localhost", 11111))
{
Stream s = client.GetStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(s, Console.ReadLine());
}
Console.ReadLine();
Video Tutorial
Auf MSDN gibt es auch einen Webcast zum Thema[4]
Referenzen
- ↑ http://msdn.microsoft.com/en-us/magazine/cc301761.aspx Jeffrey Richter: Run-time Serialization
- ↑ http://msdn.microsoft.com/de-de/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx MSDN-Artikel zur Klasse BinaryFormatter
- ↑ http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx MSDN-Artikel zur Klasse XmlSerializer
- ↑ http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032292924&EventCategory=3&culture=en-US&CountryCode=US MSDN Webcast: Advanced Serialization (Level 300)