Was ist der Unterschied zwischen der Verwendung des SerializableAttributs und der Implementierung der ISerializableSchnittstelle?
Was ist der Unterschied zwischen der Verwendung des SerializableAttributs und der Implementierung der ISerializableSchnittstelle?
Antworten:
Wenn Sie das SerializableAttributeAttribut 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 ISerializableSchnittstelle implementieren , wird die Serialisierung effektiv mit einer benutzerdefinierten Version überschrieben, indem Sie überschreiben und (und einen Konstruktor des Formulars bereitstellenGetObjectData SetObjectDataMyFoo(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.
SerializableAttribut einer Eigenschaft hinzuzufügen ? Laut MSDN kann es nur auf Klassen, Strukturen, Aufzählungen und Delegaten angewendet werden.
SerializableAttributeist der Fall : Wenn die Klasse mit dekoriert ist , kann ein Mitglied NonSerializedAttributeals ü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 GetObjectDataMethode zu serialisieren und das an sie übergebene Objekt zu aktualisieren SerializationInfo.
Über die ISerializableSchnittstelle können Sie eine andere als die Standard- Serialisierung implementieren . Wenn Sie die ISerializableSchnittstelle implementieren , müssen Sie die GetObjectDataMethode 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.