Compartilhar via


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

O modelo de programação do contrato de dados dá suporte total aos métodos de retorno de chamada de serialização tolerantes à versão aos quais as classes BinaryFormatter e SoapFormatter dão suporte.

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 a seguir explica quando usar cada atributo.

Atributo Quando o método correspondente é chamado
OnSerializingAttribute Chamado antes da serialização do tipo.
OnSerializedAttribute Chamado depois da serialização do tipo.
OnDeserializingAttribute Chamado antes da desserialização do tipo.
OnDeserializedAttribute Chamado depois da desserialização do tipo.

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

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 os valores padrão pretendidos) se os dados desses membros estiverem ausentes no fluxo de entrada, por exemplo, se os dados forem provenientes de uma versão anterior de um tipo que esteja ignorando 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

Confira também