Wywołania zwrotne serializacji z tolerancją dla wersji

Model programowania kontraktów danych w pełni obsługuje metody wywołania zwrotnego serializacji odporne na wersje, które BinaryFormatter obsługują klasy i SoapFormatter .

Atrybuty odporne na wersje

Istnieją cztery atrybuty wywołania zwrotnego. Każdy atrybut można zastosować do metody, którą aparat serializacji/deserializacji wywołuje w różnym czasie. W poniższej tabeli wyjaśniono, kiedy należy używać każdego atrybutu.

Atrybut Po wywołaniu odpowiedniej metody
OnSerializingAttribute Wywoływana przed serializacji typu.
OnSerializedAttribute Wywoływana po serializacji typu.
OnDeserializingAttribute Wywoływana przed deserializacji typu.
OnDeserializedAttribute Wywoływana po deserializacji typu.

Metody muszą akceptować StreamingContext parametr.

Te metody są przeznaczone głównie do użytku z przechowywaniem wersji lub inicjowaniem. Podczas deserializacji nie są wywoływane żadne konstruktory. W związku z tym członkowie danych mogą nie być poprawnie zainicjowane (do zamierzonych wartości domyślnych), jeśli brakuje danych dla tych elementów członkowskich w strumieniu przychodzącym, na przykład jeśli dane pochodzą z poprzedniej wersji typu, który brakuje niektórych elementów członkowskich danych. Aby rozwiązać ten krok, użyj metody wywołania zwrotnego oznaczonej symbolem OnDeserializingAttribute, jak pokazano w poniższym przykładzie.

Można oznaczyć tylko jedną metodę na typ przy użyciu każdego z powyższych atrybutów wywołania zwrotnego.

Przykład

// 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

Zobacz też