Frage

Was ist der Unterschied zwischen dem Serializable Attribute und dem ISerializable Schnittstelle implementieren?

War es hilfreich?

Lösung

Wenn Sie die SerializableAttribute Attribut ein Attribut auf einem Feld zur Compile-Zeit so setzt, dass, wenn während der Laufzeit werden die Serialisierung Einrichtungen wissen, was durch Ausführen einer Reflexion über die Klasse / Modul / Montagetyp basierend auf den Attributen serialisiert .

[Serializable]
public class MyFoo { … }

Das zeigt an, dass die oben Serialisierung Anlage die gesamte Klasse MyFoo serialisiert werden sollte, während:

public class MyFoo
{
    private int bar;

    [Serializable]
    public int WhatBar
    {
       get { return this.bar; }
    }
}

Mit dem Attribut Sie können auswählen, welche Bedürfnisse Felder serialisiert werden.

Wenn Sie die ISerializable Schnittstelle , wird die Serialisierung effektiv mit einer benutzerdefinierten Version überschrieben, durch zwingende GetObjectData und SetObjectData (und durch einen Konstruktor des Formulars MyFoo(SerializationInfo info, StreamingContext context) Providing), es wäre ein feiner Grad sein die Kontrolle über die Serialisierung der Daten.

Siehe auch dieses Beispiel für eine benutzerdefinierte Serialisierung auf Stackoverflow hier . Es zeigt, wie die Serialisierung rückwärtskompatibel zu halten mit unterschiedlichen versionings der serialisierten Daten.

Hope, das hilft.

Andere Tipps

Die SerializableAttribute weist den Rahmen, um die Standard-Serialisierung zu tun verarbeiten. Wenn Sie mehr Kontrolle benötigen, implementieren Sie die ISerializable Schnittstelle . Dann würden Sie den Ihren eigenen Code setzen das Objekt in der GetObjectData Methode zur Serialisierung und das SerializationInfo Objekts aktualisieren, die sie übergeben wird.

Die ISerializable Schnittstelle können Sie implementieren benutzerdefinierte Serialisierung andere als Standard. Wenn Sie die ISerializable-Schnittstelle implementieren, müssen Sie GetObjectData Methode außer Kraft zu setzen wie folgt

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}

ISerialize Kraft Sie Serialisierung Logik manially zu implementieren, während durch Attribut Serializable Markierung (hast du es das?) Wird Binary Serializer sagen, dass diese Klasse serialisiert werden kann. Es wird es automatisch tun.

Vererben von ISerializable können Sie benutzerdefinierte die (de) Serialisierung implementieren. Wenn nur das Attribut Serializable verwendet, kann die (de) Serialisierung nur durch Attribute und ist weniger flexibel gesteuert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top