版本容错序列化回调
数据协定编程模型充分支持 BinaryFormatter 和 SoapFormatter 类所支持的版本容错序列化回调方法。
版本容错属性
共有四个回调属性。 每个属性都可应用于序列化/反序列化引擎在不同时间调用的方法。 下表说明使用每个属性的时间。
属性 | 调用相应方法时。 |
---|---|
OnSerializingAttribute | 在序列化类型之前调用。 |
OnSerializedAttribute | 在序列化类型之后调用。 |
OnDeserializingAttribute | 在反序列化类型之前调用。 |
OnDeserializedAttribute | 在反序列化类型之后调用。 |
该方法必须接受 StreamingContext 参数。
这些方法主要计划用于版本控制或初始化。 反序列化期间,不调用任何构造函数。 因此,如果传入流中缺少数据成员的数据,则这些成员可能不会正确初始化(为既定的默认值),例如,如果数据来自缺少某些数据成员的类型的上一版本。 若要更正此错误,请使用加有 OnDeserializingAttribute 标记的回调方法,如下面的示例中所示。
只能使用上述每个回调属性对每个类型标记一个方法。
示例
// 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