2009-09-22 6 views
6

ich benutzerdefinierte Serialisierung Artikel über Msdn Lesen: http://msdn.microsoft.com/en-us/library/ty01x675%28VS.80%29.aspxOnSerializingAttribute vs ISerializable

Es wird erwähnt, dass es zwei Möglichkeiten gibt der individuelle Serialisierung Implementierung:
1, mit OnDeserializedAttribute, OnDeserializingAttribute, OnSerializedAttribute, OnSerializingAttribute
2, implementieren ISerializable Schnittstelle

Nach Nach MSDN ist Methode # 1 "Best Practice and Easy", aber ich verstehe nicht, wie die beiden Methoden sogar die gleiche Sache sind. Nach meinem Verständnis, die OnSerializing|OnSerialized|etc Attribute können Sie Methoden zu bestimmten Phasen der Serialisierung haken, während Schnittstelle können Sie direkt ändern, was geht in und kommt aus SerializationInfo. Ist das richtig?

Um meine Verwirrung in den Kontext zu bringen, wie implementieren Sie OnSerializing, um Objektfeld unter einem anderen Namen zu serialisieren? wie dem folgenden Code:

 
public virtual void GetObjectData(SerializationInfo info, StreamingContext context) 
{ 
    info.AddValue("i", n1); 
    info.AddValue("j", n2); 
    info.AddValue("k", str); 
} 

aktualisieren: Obwohl Antwort Frederik Gheysels ist nicht ganz korrekt ist (mit Serializable Dekoration ist Voraussetzung für beide OnSerializing/OnDeserializing Attribute und ISerializable-Schnittstelle), hat er weist jedoch darauf hin, dass OnSerializing/OnDeserializing Attribute sind als Ergänzung von ISerializable gedacht, daher akzeptiere ich seine Antwort in diesem Punkt.

Antwort

4

OnSerializing/OnDeserializing ist komplementär zu ISerializable oder SerializableAttribute.

Mit anderen Worten: OnSerializing/OnDeserializing ist keine Alternative für ISerializable oder die SerializableAttribute.

Mit diesen beiden Attributen (OnSerializing/OnDeserializing) können Sie zusätzliche Aktionen ausführen, wenn ein Objekt serialisiert oder deserialisiert wird. Damit dies jedoch möglich ist, muss der Typ, auf den diese Attribute angewendet werden, serialisierbar sein (und somit die Schnittstelle ISerializable implementieren oder mit dem Attribut Serializable versehen sein).

Dies wird auch in dem MSDN-Artikel, auf den Sie sich beziehen, so genannt: - OnSerializing und OnDeserializing werden verwendet, um Daten während und nach der Serialisierung zu "korrigieren".

Sie können es ziemlich einfach testen. erstellen Art wie diese, und versuchen, es zu serialisieren:

public class Foo 
{ 
    private int _bar = 5; 

    [OnSerializing] 
    public void OnSerializeFoo(StreamingContext context) 
    { 
     _bar = 10; 
    } 
} 

Beachten Sie, dass der Typ nicht ISerializable nicht implementiert, noch ist es mit dem SerializableAttribute eingerichtet. Versuchen Sie, eine Instanz dieses Typs zu serialisieren, und Sie werden mit einer SerializationException konfrontiert, weil Foo nicht serialisierbar ist.

So können Sie diese Attribute (OnSerializing, OnDeserializing) verwenden, um zusätzliche Logik zu implementieren, die ausgeführt werden soll, wenn eine Instanz eines bestimmten Typs serialisiert oder deserialisiert wird.

+0

Auch in dem MSDN-Artikel, auf den verwiesen wird, gibt es einen Satz, der besagt ".... Beachten Sie jedoch, dass die Methode in dem vorherigen Abschnitt diese Methode überschreibt, um Serialisierung zu steuern" wenn auf ISerializable Schnittstelle verwiesen wird.
Bedeutet das, OnSerializing/OnDeserializing Attribute werden Methoden der ISerializable-Schnittstelle ersetzen? Oder habe ich diesen Satz falsch interpretiert? –

Verwandte Themen