Was ist der Unterschied zwischen dem Serializable-Attribute & Umsetzung ISerializable?
-
23-09-2019 - |
Frage
Was ist der Unterschied zwischen dem Serializable
Attribute und dem ISerializable
Schnittstelle implementieren?
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 (und durch einen Konstruktor des Formulars SetObjectData
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.