(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

ISerializable-Schnittstelle

Ermöglicht einem Objekt, die eigene Serialisierung und Deserialisierung zu überwachen.

Namespace:  System.Runtime.Serialization
Assembly:  mscorlib (in mscorlib.dll)

[ComVisibleAttribute(true)]
public interface ISerializable

Der ISerializable-Typ macht die folgenden Member verfügbar.

  NameBeschreibung
Öffentliche MethodeGetObjectDataFüllt eine SerializationInfo mit den Daten auf, die zum Serialisieren des Zielobjekts erforderlich sind.
Zum Seitenanfang

Alle Klassen, die möglicherweise serialisiert werden, müssen mit dem SerializableAttribute markiert werden. Wenn eine Klasse die eigene Serialisierung überwachen muss, kann diese die ISerializable-Schnittstelle implementieren. Der Formatter ruft während der Serialisierung GetObjectData auf und füllt die angegebene SerializationInfo mit allen zur Darstellung des Objekts erforderlichen Daten. Der Formatter erstellt eine SerializationInfo mit dem Typ des Objekts im Diagramm. Objekte, die Proxys senden müssen, können die übertragenen Informationen mithilfe der FullTypeName-Methode und der AssemblyName-Methode für die SerializationInfo ändern.

Im Fall der Klassenvererbung kann eine Klasse, die von einer Basisklasse abgeleitet ist, die ISerializable implementiert, serialisiert werden. In diesem Fall sollte die abgeleitete Klasse die Basisklassenimplementierung von GetObjectData in ihrer Implementierung von GetObjectData aufrufen. Andernfalls werden die Daten von der Basisklasse nicht serialisiert.

Die ISerializable-Schnittstelle impliziert einen Konstruktor mit der Signatur Konstruktor(SerializationInfo-Informationen, StreamingContext-Kontext). Während der Deserialisierung wird der aktuelle Konstruktor erst aufgerufen, nachdem die Daten in der SerializationInfo vom Formatierungsprogramm deserialisiert wurden. Dieser Konstruktor sollte i. d. R. geschützt sein, sofern die Klasse nicht versiegelt ist.

Die Reihenfolge, in der Objekte deserialisiert werden, kann nicht garantiert werden. Wenn beispielsweise ein Typ auf einen noch nicht deserialisierten Typ verweist, tritt eine Ausnahme auf. Beim Erstellen von Typen mit derartigen Abhängigkeiten umgehen Sie dieses Problem, indem Sie die IDeserializationCallback-Schnittstelle und die OnDeserialization-Methode implementieren.

Die Serialisierungsarchitektur behandelt Objekttypen, die MarshalByRefObject erweitern, wie Typen, die Object erweitern. Diese Typen können wie alle anderen Objekttypen mit dem SerializableAttribute markiert werden und die ISerializable-Schnittstelle implementieren. Der Objektzustand der Typen wird aufgezeichnet und im Stream gespeichert.

Wenn diese Typen über System.Runtime.Remoting verwendet werden, stellt die Remotinginfrastruktur einen Ersatz bereit, der Vorrang vor der normalen Serialisierung hat und stattdessen einen Proxy in das MarshalByRefObject serialisiert. Ein Ersatz ist eine Hilfsfunktion, die Objekte eines bestimmten Typs serialisieren und deserialisieren kann. Der Proxy, der den Benutzern i. d. R. nicht sichtbar ist, ist vom Typ ObjRef.

In allgemein üblichen Entwurfsmustern wird eine Klasse, die MarshalByRefObject erweitert, i. d. R. nicht mit dem serializable-Attribut markiert Entwickler sollten bei der Kombination dieser beiden Merkmale die möglichen Serialisierungs- und Remoteszenarien genau überdenken. Eine Anwendungsmöglichkeit ist z. B. ein MemoryStream. Obwohl die Basisklasse von MemoryStream (Stream) eine Erweiterung von MarshalByRefObject ist, kann der Zustand eines MemoryStream nach Belieben aufgezeichnet und wiederhergestellt werden. Es kann deshalb sinnvoll sein, den Zustand dieses Streams in eine Datenbank zu serialisieren und zu einem späteren Zeitpunkt wiederherzustellen. Objekte dieses Typs würden jedoch in einer Remotesituation über ein Proxy übermittelt werden.

Weitere Informationen über die Serialisierung von Klassen, die MarshalByRefObject erweitern, finden Sie unter RemotingSurrogateSelector. Weitere Informationen über das Implementieren von ISerializable finden Sie unter Benutzerdefinierte Serialisierung.

Hinweise zur Implementierung

Implementieren Sie diese Schnittstelle, damit ein Objekt an der eigenen Serialisierung und Deserialisierung teilnehmen kann.

Im folgenden Codebeispiel wird die Definition eines benutzerdefinierten Serialisierungsverhaltens einer Klasse mithilfe der ISerializable-Schnittstelle veranschaulicht.


using System;
using System.Text;
using System.IO;
// Add references to Soap and Binary formatters.
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap ;
using System.Runtime.Serialization;


[Serializable]
public class MyItemType : ISerializable
{
    public MyItemType()
    {
        // Empty constructor required to compile.
    }

    // The value to serialize.
    private string myProperty_value;

    public string MyProperty
    {
        get { return myProperty_value; }
        set { myProperty_value = value; }
    }

    // Implement this method to serialize data. The method is called 
    // on serialization.
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        // Use the AddValue method to specify serialized values.
        info.AddValue("props", myProperty_value, typeof(string));

    }

    // The special constructor is used to deserialize values.
    public MyItemType(SerializationInfo info, StreamingContext context)
    {
        // Reset the property value using the GetValue method.
        myProperty_value = (string) info.GetValue("props", typeof(string));
    }
}

// This is a console application. 
public static class Test
{
    static void Main()
    {
        // This is the name of the file holding the data. You can use any file extension you like.
        string fileName = "dataStuff.myData";

        // Use a BinaryFormatter or SoapFormatter.
        IFormatter formatter = new BinaryFormatter();
        //IFormatter formatter = new SoapFormatter();

        Test.SerializeItem(fileName, formatter); // Serialize an instance of the class.
        Test.DeserializeItem(fileName, formatter); // Deserialize the instance.
        Console.WriteLine("Done");
        Console.ReadLine();
    }

    public static void SerializeItem(string fileName, IFormatter formatter)
    {
        // Create an instance of the type and serialize it.
        MyItemType t = new MyItemType();
        t.MyProperty = "Hello World";

        FileStream s = new FileStream(fileName , FileMode.Create);
        formatter.Serialize(s, t);            
        s.Close();
    }


    public static void DeserializeItem(string fileName, IFormatter formatter)
    {
        FileStream s = new FileStream(fileName, FileMode.Open);
        MyItemType t = (MyItemType)formatter.Deserialize(s);
        Console.WriteLine(t.MyProperty);            
    }       
}


.NET Framework

Unterstützt in: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft