Share via


Callbacks voor serialisatie van versietolerante

Het programmeermodel van het gegevenscontract biedt volledige ondersteuning voor de callbackmethoden voor serialisatie die door de BinaryFormatter en SoapFormatter klassen worden ondersteund.

Versietolerante kenmerken

Er zijn vier callback-kenmerken. Elk kenmerk kan worden toegepast op een methode die de serialisatie-/deserialisatie-engine op verschillende momenten aanroept. In de onderstaande tabel wordt uitgelegd wanneer u elk kenmerk gebruikt.

Kenmerk Wanneer de bijbehorende methode wordt aangeroepen
OnSerializingAttribute Aangeroepen voordat het type wordt geserialiseerd.
OnSerializedAttribute Aangeroepen na het serialiseren van het type.
OnDeserializingAttribute Wordt aangeroepen voordat het type wordt gedeserialiseerd.
OnDeserializedAttribute Aangeroepen na het deserialiseren van het type.

De methoden moeten een StreamingContext parameter accepteren.

Deze methoden zijn voornamelijk bedoeld voor gebruik met versiebeheer of initialisatie. Tijdens deserialisatie worden geen constructors aangeroepen. Daarom worden gegevensleden mogelijk niet correct geïnitialiseerd (naar de beoogde standaardwaarden) als de gegevens voor deze leden ontbreken in de binnenkomende stroom, bijvoorbeeld als de gegevens afkomstig zijn van een eerdere versie van een type dat bepaalde gegevensleden mist. Als u dit wilt corrigeren, gebruikt u de callbackmethode die is gemarkeerd met de OnDeserializingAttributemethode , zoals wordt weergegeven in het volgende voorbeeld.

U kunt slechts één methode per type markeren met elk van de voorgaande callback-kenmerken.

Voorbeeld

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

Zie ook