Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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