Zpětná volání serializace tolerantní k verzím
Programovací model kontraktů dat plně podporuje metody zpětného volání serializace odolné proti verzi, které BinaryFormatter podporují a SoapFormatter třídy.
Atributy odolné proti verzím
Existují čtyři atributy zpětného volání. Každý atribut lze použít na metodu, kterou serializace/deserializační modul volá v různých časech. Následující tabulka vysvětluje, kdy použít jednotlivé atributy.
Atribut | Při zavolání odpovídající metody |
---|---|
OnSerializingAttribute | Volá se před serializací typu. |
OnSerializedAttribute | Volá se po serializaci typu. |
OnDeserializingAttribute | Volá se před deserializací typu. |
OnDeserializedAttribute | Volá se po deserializaci typu. |
Metody musí přijmout StreamingContext parametr.
Tyto metody jsou primárně určeny pro použití s správou verzí nebo inicializací. Během deserializace se nevolají žádné konstruktory. Datové členy proto nemusí být správně inicializovány (podle zamýšlených výchozích hodnot), pokud data pro tyto členy chybí v příchozím datovém proudu, například pokud data pocházejí z předchozí verze typu, který chybí některým datovým členům. Chcete-li tento problém opravit, použijte metodu zpětného volání označenou metodou OnDeserializingAttribute, jak je znázorněno v následujícím příkladu.
U každého z předchozích atributů zpětného volání můžete označit pouze jednu metodu na typ.
Příklad
// 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