Was ist der Unterschied zwischen der Verwendung des Serializable
Attributs und der Implementierung der ISerializable
Schnittstelle?
Was ist der Unterschied zwischen der Verwendung des Serializable
Attributs und der Implementierung der ISerializable
Schnittstelle?
Antworten:
Wenn Sie das SerializableAttribute
Attribut verwenden, fügen Sie ein Attribut zur Kompilierungszeit so in ein Feld ein, dass die Serialisierungsfunktionen zur Laufzeit anhand der Attribute wissen, was zu serialisieren ist, indem sie die Klasse / das Modul / die Assembly reflektieren Art.
[Serializable]
public class MyFoo { … }
Das Obige gibt an, dass die Serialisierungsfunktion die gesamte Klasse serialisieren sollte MyFoo
, während:
public class MyFoo
{
private int bar;
[Serializable]
public int WhatBar
{
get { return this.bar; }
}
}
Mit dem Attribut können Sie selektiv auswählen, welche Felder serialisiert werden sollen.
Wenn Sie die ISerializable
Schnittstelle implementieren , wird die Serialisierung effektiv mit einer benutzerdefinierten Version überschrieben, indem Sie überschreiben und (und einen Konstruktor des Formulars bereitstellenGetObjectData
SetObjectData
MyFoo(SerializationInfo info, StreamingContext context)
) wird die Serialisierung der Daten genauer gesteuert.
Siehe auch dieses Beispiel einer benutzerdefinierten Serialisierung hier auf StackOverflow . Es wird gezeigt, wie die Serialisierung mit verschiedenen Versionen der serialisierten Daten abwärtskompatibel bleibt.
Hoffe das hilft.
Serializable
Attribut einer Eigenschaft hinzuzufügen ? Laut MSDN kann es nur auf Klassen, Strukturen, Aufzählungen und Delegaten angewendet werden.
SerializableAttribute
ist der Fall : Wenn die Klasse mit dekoriert ist , kann ein Mitglied NonSerializedAttribute
als übersprungen markiert werden, wie mehrere Personen (und MSDN) sagten. Wenn die Rekonstruktion eines bestimmten Objekts in einer anderen Umgebung bedeutungslos ist, ist es ratsam, es nicht zu serialisieren. ..
Das SerializableAttribute weist das Framework an, den Standard-Serialisierungsprozess durchzuführen. Wenn Sie mehr Kontrolle benötigen, können Sie die ISerializable-Schnittstelle implementieren . Dann würden Sie Ihren eigenen Code einfügen, um das Objekt in der GetObjectData
Methode zu serialisieren und das an sie übergebene Objekt zu aktualisieren SerializationInfo
.
Über die ISerializable
Schnittstelle können Sie eine andere als die Standard- Serialisierung implementieren . Wenn Sie die ISerializable
Schnittstelle implementieren , müssen Sie die GetObjectData
Methode wie folgt überschreiben
public void GetObjectData (SerializationInfo serInfo,
StreamingContext streamContext)
{
// Implement custom Serialization
}
Durch das Erben von ISerializable können Sie die (De-) Serialisierung benutzerdefiniert implementieren. Wenn nur das Attribut Serializable verwendet wird, kann die (De-) Serialisierung nur durch Attribute gesteuert werden und ist weniger flexibel.