如何在取消序列化之前调用构造函数
本文关键字:调用 构造函数 序列化 取消 | 更新日期: 2023-09-27 18:29:19
我尝试通过数据协定序列化来序列化和反序列化自定义类。连载效果很好。然而,当反序列化时,我遇到了一个问题,因为这个(来源):
反序列化对象时不调用构造函数。
问题是我在构造函数中做了一些初始化。其中包括一些数据结构。
如果没有对构造函数的调用,则数据结构为null
,并且在取消序列化期间对setter函数的调用将失败。
在使用任何访问器之前,如何在取消序列化过程之前或期间调用构造函数或初始化对象
有几个方法我可以通过属性声明为回调,如下所示(同一来源):
// This method is called after the object
// is completely deserialized. Use it instead of the
// constructror.
[OnDeserialized]
void OnDeserialized(StreamingContext context)
{
fullName = firstName + " " + lastName;
}
但看起来它们都是在取消序列化后触发的。
我必须切换到XML序列化吗
创建一个具有签名的构造函数
protected YourClassName(SerializationInfo info, StreamingContext context)
{
}
并让您的类实现CCD_ 2。在序列化时调用ISerializable.GetObjectData()
,在反序列化时调用上述构造函数。
请参阅自定义序列化:在MSDN 上实现ISerializable接口
如果您实际上不需要在构造函数中执行工作,则可以使用属性[OnDeserializing]
而不是[OnDeserialized]
来在反序列化之前而不是之后完成的工作。
[OnDeserializing]
private void SetValuesOnDeserializing(StreamingContext context)
{
// Code not shown.
}
注意:如果对象图中有多个[OnDeserializing]
方法,则调用它们的顺序不是按顺序的。