Callback di serializzazione a tolleranza di versione
Il modello di programmazione del contratto dati supporta appieno i metodi di callback della serializzazione a tolleranza di versione supportati dalle classi BinaryFormatter e SoapFormatter.
Attributi a tolleranza di versione
Sono disponibili quattro attributi di callback. Ogni attributo può essere applicato a un metodo che il motore di serializzazione/deserializzazione chiama in vari momenti. Nella tabella seguente viene illustrato quando utilizzare ogni attributo.
Attributo | Quando viene chiamato il metodo corrispondente |
---|---|
OnSerializingAttribute | Chiamato prima di serializzare il tipo. |
OnSerializedAttribute | Chiamato dopo aver serializzato il tipo. |
OnDeserializingAttribute | Chiamato prima di deserializzare il tipo. |
OnDeserializedAttribute | Chiamato dopo aver deserializzato il tipo. |
I metodi devono accettare un parametro StreamingContext.
Questi metodi sono destinati principalmente ad essere utilizzati per il controllo della versione o l'inizializzazione. Durante la deserializzazione, non viene chiamato alcun costruttore. È quindi possibile che i membri dati non vengano inizializzati correttamente (sugli appropriati valori predefiniti) se mancano i dati per questi membri nel flusso in ingresso, ad esempio, se i dati provengono da una versione precedente di un tipo in cui mancano alcuni membri dati. Per correggere questo problema, utilizzare il metodo di callback contrassegnato con OnDeserializingAttribute, come illustrato nell'esempio seguente.
È possibile contrassegnare solo uno metodo per tipo con ognuno dei precedenti attributi di callback.
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