Dela via


Versionstoleranta återanrop för serialisering

Programmeringsmodellen för datakontrakt har fullt stöd för de versionstoleranta serialiseringsmetoderna för återanrop som klasserna BinaryFormatter och SoapFormatter stöder.

Versionstoleranta attribut

Det finns fyra motringningsattribut. Varje attribut kan tillämpas på en metod som serialiserings-/deserialiseringsmotorn anropar vid olika tidpunkter. Tabellen nedan förklarar när du ska använda varje attribut.

Attribut När motsvarande metod anropas
OnSerializingAttribute Anropas innan typen serialiseras.
OnSerializedAttribute Anropas efter serialisering av typen.
OnDeserializingAttribute Anropas innan deserialisera typen.
OnDeserializedAttribute Anropas efter deserialisering av typen.

Metoderna måste acceptera en StreamingContext parameter.

Dessa metoder är främst avsedda för användning med versionshantering eller initiering. Under deserialiseringen anropas inga konstruktorer. Datamedlemmar kanske därför inte initieras korrekt (till avsedda standardvärden) om data för dessa medlemmar saknas i den inkommande dataströmmen, till exempel om data kommer från en tidigare version av en typ som saknar vissa datamedlemmar. Du korrigerar detta genom att använda motringningsmetoden markerad med OnDeserializingAttribute, som du ser i följande exempel.

Du kan bara markera en metod per typ med vart och ett av de föregående motringningsattributen.

Exempel

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

Se även