Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die einfachste Möglichkeit, eine Klasse serialisierbar zu machen, besteht darin, sie in folgender Weise mit dem Serializable-Attribut zu markieren.
[Serializable]
public class MyObject {
public int n1 = 0;
public int n2 = 0;
public String str = null;
}
Das im Folgenden abgebildete Codebeispiel zeigt, wie eine Instanz dieser Klasse in eine Datei serialisiert werden kann.
MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "Some String";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
In diesem Beispiel wird zur Ausführung der Serialisierung ein binäres Formatierungsprogramm verwendet. Sie müssen also lediglich eine Instanz des zu verwendenden Streams und des zu verwendenden Formatierungsprogramms erstellen und dann die Serialize-Methode für das Formatierungsprogramm aufrufen. Der zu serialisierende Stream und das zu serialisierende Objekt werden für den Aufruf als Parameter bereitgestellt. Obwohl dieser Vorgang in diesem Beispiel nicht explizit demonstriert wird, werden alle Membervariablen (d. h. auch die als privat gekennzeichneten) einer Klasse serialisiert. In dieser Hinsicht unterscheidet sich die binäre Serialisierung von der XMLSerializer-Klasse, die nur öffentliche Felder serialisiert. Weitere Informationen über das Ausschließen von Membervariablen von der binären Serialisierung finden Sie unter Selektive Serialisierung.
Genauso einfach ist es, den früheren Zustand des Objekts wiederherzustellen. Hierzu erstellen Sie zunächst einen Stream zum Lesen und einen Formatter, und anschließend weisen Sie das Formatierungsprogramm an, das Objekt zu deserialisieren. Im folgenden Codebeispiel wird dieser Vorgang demonstriert.
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(stream);
stream.Close();
// Here's the proof.
Console.WriteLine("n1: {0}", obj.n1);
Console.WriteLine("n2: {0}", obj.n2);
Console.WriteLine("str: {0}", obj.str);
Der oben verwendete BinaryFormatter ist sehr effektiv und erzeugt einen kompakten Bytestream. Alle Objekte, die mit diesem Formatierungsprogramm serialisiert werden, können mit diesem Programm auch deserialisiert werden, d. h., das Programm ist das ideale Tool für die Serialisierung von Objekten, die auf .NET Framework deserialisiert werden sollen. Beachten Sie unbedingt, dass während der Deserialisierung eines Objekts keine Konstruktoren aufgerufen werden. Diese für die Deserialisierung geltende Einschränkung gilt aus Gründen der Leistungssteigerung. Einige der üblichen Abmachungen zwischen Runtime und Objektautor werden dadurch jedoch verletzt, d. h., als Entwickler sollten Sie sich der Konsequenzen genau bewusst sein, wenn Sie ein Objekt als serialisierbar markieren.
Wenn die Portabilität ebenfalls zu den Anforderungen gehört, verwenden Sie SoapFormatter. Ersetzen Sie den BinaryFormatter im obigen Codebeispiel einfach durch SoapFormatter, und rufen Sie Serialize und Deserialize wie gewohnt auf. Dieses Formatierungsprogramm erzeugt für das oben verwendete Beispiel die folgende Ausgabe.
<SOAP-ENV:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP- ENC="https://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP- ENV="https://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle=
"https://schemas.microsoft.com/soap/encoding/clr/1.0"
"https://schemas.xmlsoap.org/soap/encoding/"
xmlns:a1="https://schemas.microsoft.com/clr/assem/ToFile">
<SOAP-ENV:Body>
<a1:MyObject id="ref-1">
<n1>1</n1>
<n2>24</n2>
<str id="ref-3">Some String</str>
</a1:MyObject>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Beachten Sie unbedingt, dass das Serializable-Attribut nicht vererbt werden kann. Wenn eine neue Klasse von MyObject abgeleitet wird, muss auch diese neue Klasse mit dem Attribut markiert werden, da sie andernfalls nicht serialisiert werden kann. Wenn Sie beispielsweise den Versuch unternehmen, eine Instanz der unten stehenden Klasse zu serialisieren, erhalten Sie eine SerializationException, die Sie darauf hinweist, dass der Typ MyStuff nicht als serialisierbar markiert ist.
public class MyStuff : MyObject
{
public int n3;
}
Die Verwendung des Serializable-Attributs ist äußerst praktisch. Wie oben gezeigt wurde, bestehen jedoch auch gewisse Einschränkungen. In den Richtlinien für die Serialisierung finden Sie Informationen darüber, wann eine Klasse für die Serialisierung gekennzeichnet werden sollte. Die Serialisierung kann einer Klasse nach deren Kompilierung nicht mehr hinzugefügt werden.
Siehe auch
Binäre Serialisierung | Zugriff auf Objekte in anderen Anwendungsdomänen mit .NET-Remoting | XML- und SOAP-Serialisierung