Retornos de chamada de serialização tolerantes à versão

O modelo de programação de contrato de dados suporta totalmente os métodos de retorno de chamada de serialização tolerantes à versão que as BinaryFormatter classes e SoapFormatter suportam.

Atributos tolerantes à versão

Há quatro atributos de retorno de chamada. Cada atributo pode ser aplicado a um método que o mecanismo de serialização/desserialização chama em vários momentos. A tabela abaixo explica quando usar cada atributo.

Atributo Quando o método correspondente é chamado
OnSerializingAttribute Chamado antes de serializar o tipo.
OnSerializedAttribute Chamado após serializar o tipo.
OnDeserializingAttribute Chamado antes de desserializar o tipo.
OnDeserializedAttribute Chamado após a desserialização do tipo.

Os métodos devem aceitar um StreamingContext parâmetro.

Esses métodos destinam-se principalmente ao uso com controle de versão ou inicialização. Durante a desserialização, nenhum construtor é chamado. Portanto, os membros de dados podem não ser inicializados corretamente (para valores padrão pretendidos) se os dados para esses membros estiverem faltando no fluxo de entrada, por exemplo, se os dados vierem de uma versão anterior de um tipo que está faltando alguns membros de dados. Para corrigir isso, use o método de retorno de chamada marcado com o OnDeserializingAttribute, conforme mostrado no exemplo a seguir.

Você pode marcar apenas um método por tipo com cada um dos atributos de retorno de chamada anteriores.

Exemplo

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

Consulte também