Versionstolerante SerialisierungsrückrufeVersion-Tolerant Serialization Callbacks

Die von den Klassen BinaryFormatter und SoapFormatter unterstützten Methoden für versionstolerante Serialisierungsrückrufe werden vom Datenvertrags-Programmiermodell vollständig unterstützt.The data contract programming model fully supports the version-tolerant serialization callback methods that the BinaryFormatter and SoapFormatter classes support.

Versionstolerante AttributeVersion-Tolerant Attributes

Es gibt vier Rückrufattribute.There are four callback attributes. Jedes Attribut kann für eine Methode angewendet werden, die das Serialisierungs-/Deserialisierungmodul zu verschiedenen Zeiten aufruft.Each attribute can be applied to a method that the serialization/deserialization engine calls at various times. In der folgenden Tabelle wird erläutert, wann die einzelnen Attribute verwendet werden.The table below explains when to use each attribute.

AttributAttribute Beim Aufruf der entsprechenden MethodeWhen the corresponding method is called
OnSerializingAttribute Der Aufruf erfolgt vor dem Serialisieren des Typs.Called before serializing the type.
OnSerializedAttribute Der Aufruf erfolgt nach dem Serialisieren des Typs.Called after serializing the type.
OnDeserializingAttribute Der Aufruf erfolgt vor dem Deserialisieren des Typs.Called before deserializing the type.
OnDeserializedAttribute Der Aufruf erfolgt nach dem Deserialisieren des Typs.Called after deserializing the type.

Diese Methode muss einen StreamingContext-Parameter akzeptieren.The methods must accept a StreamingContext parameter.

Diese Methoden sind in erster Linie für die Verwendung mit der Versionsverwaltung oder der Initialisierung bestimmt.These methods are primarily intended for use with versioning or initialization. Während der Deserialisierung werden keine Konstruktoren aufgerufen.During deserialization, no constructors are called. Datenmember werden deshalb möglicherweise nicht ordnungsgemäß initialisiert (auf beabsichtigte Standardwerte), falls die Daten für diese Member im eingehenden Stream fehlen. Das kann z. B. der Fall sein, wenn die Daten aus einer früheren Version eines Typs stammen, bei dem einige Datenmember fehlen.Therefore, data members may not be correctly initialized (to intended default values) if the data for these members is missing in the incoming stream, for example, if the data comes from a previous version of a type that is missing some data members. Verwenden Sie die mit OnDeserializingAttribute gekennzeichnete Methode, wie im folgenden Beispiel dargestellt, um dieses Problem zu beheben.To correct this, use the callback method marked with the OnDeserializingAttribute, as shown in the following example.

Mit jedem der oben aufgeführten Rückrufattribute kann nur eine Methode pro Typ gekennzeichnet werden.You can mark only one method per type with each of the preceding callback attributes.

BeispielExample

// The following Data Contract is version 2 of an earlier data 
// contract.
[DataContract]
public class Address
{
    [DataMember]
    public string Street;

    [DataMember]
    public string State;

    // This data member was added in version 2, and thus may be missing 
    // in the incoming data if the data conforms to version 1 of the 
    // Data Contract. Use the callback to add a default for this case.
    [DataMember(Order=2)]
    public string CountryRegion;

    // This method is used as a kind of constructor to initialize
    // a default value for the CountryRegion data member before 
    // deserialization.
    [OnDeserializing]
    private void setDefaultCountryRegion(StreamingContext c)
    {
        CountryRegion = "Japan";
    }
}
' The following Data Contract is version 2 of an earlier data 
' contract.
<DataContract()>  _
Public Class Address
    <DataMember()>  _
    Public Street As String
    <DataMember()>  _
    Public State As String
    
    ' This data member was added in version 2, and thus may be missing 
    ' in the incoming data if the data conforms to version 1 of the 
    ' Data Contract.
    <DataMember(Order := 2)>  _
    Public CountryRegion As String
    
    ' This method is used as a kind of constructor to initialize
    ' a default value for the CountryRegion data member before 
    ' deserialization.
    <OnDeserializing()>  _
    Private Sub setDefaultCountryRegion(ByVal c As StreamingContext) 
        CountryRegion = "Japan"
    End Sub 
End Class 

Siehe auchSee Also

OnSerializingAttribute
OnSerializedAttribute
OnDeserializingAttribute
OnDeserializedAttribute
StreamingContext
Versionstolerante SerialisierungVersion Tolerant Serialization