Condividi tramite


callback di serializzazione Version-Tolerant

Il modello di programmazione del contratto sui dati supporta completamente i metodi di callback di serializzazione tolleranti alla versione che le classi BinaryFormatter e SoapFormatter supportano.

attributi Version-Tolerant

Sono disponibili quattro attributi di callback. Ogni attributo può essere applicato a un metodo che il motore di serializzazione/deserializzazione chiama in vari momenti. La tabella seguente illustra quando usare ogni attributo.

Attributo Quando viene chiamato il metodo corrispondente
OnSerializingAttribute Chiamato prima di serializzare il tipo.
OnSerializedAttribute Chiamato dopo la serializzazione del tipo.
OnDeserializingAttribute Viene chiamato prima di deserializzare il tipo.
OnDeserializedAttribute Chiamato dopo la deserializzazione del tipo.

I metodi devono accettare un StreamingContext parametro.

Questi metodi sono destinati principalmente all'uso con il controllo delle versioni o l'inizializzazione. Durante la deserializzazione, non viene chiamato alcun costruttore. Pertanto, i membri dati potrebbero non essere inizializzati correttamente (per i valori predefiniti previsti) se i dati per questi membri mancano nel flusso in ingresso, ad esempio, se i dati provengono da una versione precedente di un tipo che manca alcuni membri dati. Per risolvere il problema, usare il metodo di callback contrassegnato con OnDeserializingAttribute, come illustrato nell'esempio seguente.

È possibile contrassegnare un solo metodo per tipo con ognuno degli attributi di callback precedenti.

Esempio

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

Vedere anche