Sdílet prostřednictvím


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

Viz také