Bagikan melalui


Panggilan Balik Serialisasi Toleran Versi

Model pemrograman kontrak data sepenuhnya mendukung metode panggilan balik serialisasi toleran versi yang didukung kelas BinaryFormatter dan SoapFormatter.

Atribut Toleran Versi

Ada empat atribut panggilan balik. Setiap atribut dapat diterapkan pada metode yang dipanggil oleh mesin serialisasi/deserialisasi pada berbagai waktu. Tabel di bawah ini menjelaskan kapan harus menggunakan setiap atribut.

Atribut Ketika metode yang sesuai dipanggil
OnSerializingAttribute Dipanggil sebelum menserialisasi jenis.
OnSerializedAttribute Dipanggil setelah menserialisasi jenis.
OnDeserializingAttribute Dipanggil sebelum mendeserialisasi jenis.
OnDeserializedAttribute Dipanggil setelah mendeserialisasi jenis.

Metode harus menerima parameter StreamingContext.

Metode ini utamanya dimaksudkan untuk digunakan dengan penerapan versi atau inisialisasi. Selama deserialisasi, tidak ada konstruktor yang dipanggil. Oleh karena itu, anggota data mungkin tidak diinsialisasi dengan benar (ke nilai default yang dimaksudkan) jika data untuk anggota ini tidak ditemukan dalam aliran masuk, misalnya, jika data berasal dari versi sebelumnya dari jenis yang tidak memiliki beberapa anggota data. Untuk memperbaiki hal ini, gunakan metode panggilan balik yang ditandai dengan OnDeserializingAttribute, seperti yang ditunjukkan dalam contoh berikut.

Anda hanya dapat menandai satu metode per jenis dengan masing-masing atribut panggilan balik sebelumnya.

Contoh

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

Lihat juga