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