Was ist der Unterschied zwischen der Verwendung des Serializable
Attributs und der Implementierung der ISerializable
Schnittstelle?
c#
inheritance
attributes
serialization
iserializable
SoftwareGeek
quelle
quelle
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 überschreibenund(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.
quelle
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 MitgliedNonSerializedAttribute
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 aktualisierenSerializationInfo
.quelle
Über die
ISerializable
Schnittstelle können Sie eine andere als die Standard- Serialisierung implementieren . Wenn Sie dieISerializable
Schnittstelle implementieren , müssen Sie dieGetObjectData
Methode wie folgt überschreibenpublic void GetObjectData (SerializationInfo serInfo, StreamingContext streamContext) { // Implement custom Serialization }
quelle
ISerialize zwingt Sie, die Serialisierungslogik manuell zu implementieren, während das Markieren mit dem Attribut Serializable (meinten Sie das?) Dem Binary Serializer mitteilt, dass diese Klasse serialisiert werden kann. Es wird es automatisch tun.
quelle
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.
quelle