Devoluciones de llamadas en la serialización tolerante a versiones
El modelo de programación del contrato de datos admite totalmente los métodos de devolución de llamada de serialización tolerante a versiones que las clases BinaryFormatter y SoapFormatter admiten.
Atributos tolerantes a versiones
Hay cuatro atributos de devolución de llamada. Cada atributo se puede aplicar a un método que el motor de serialización/deserialización denomina en varios momentos. La siguiente tabla explica cuándo utilizar cada atributo.
Atributo | Cuando se llama al método correspondiente |
---|---|
OnSerializingAttribute | Llamado antes de serializar el tipo. |
OnSerializedAttribute | Llamado después de serializar el tipo. |
OnDeserializingAttribute | Llamado antes de deserializar el tipo. |
OnDeserializedAttribute | Llamado después de deserializar el tipo. |
Los métodos deben aceptar un parámetro StreamingContext.
Estos métodos están pensados principalmente para utilizarlos con controlador de versiones o inicialización. No se llama a ningún constructor durante la deserialización. Por lo tanto, puede que no se puedan inicializar correctamente los miembros de datos (en valores predeterminados intencionales), si los datos de estos miembros faltan en la secuencia de entrada, por ejemplo, si los datos proceden de una versión anterior de un tipo al cual le faltan algunos miembros de datos. Para corregirlo, utilice el método de devolución de llamada marcado con OnDeserializingAttribute, tal y como se muestra en el siguiente ejemplo.
Puede marcar sólo un método por tipo con cada uno de los atributos de devolución de llamada anteriores.
Ejemplo
// 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