如何在反序列化之前调用构造函数?
How can I call the constructor before deserialisation?
我尝试通过数据协定序列化对自定义 class 进行序列化和反序列化。
序列化效果很好。但是,在反序列化时,我 运行 遇到了问题,因为这个 (source):
Constructors are not called when objects are deserialized.
问题是我在构造函数中做了一些初始化。
这包括一些数据结构。
如果不调用构造函数,数据结构是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)
{
}
并让您的 class 实施 ISerializable
。在序列化时,它在 de-serialization 上调用 ISerializable.GetObjectData()
,它调用上面的构造函数。
请参阅 MSDNCustom Serialization: Implementing the ISerializable Interface
如果您实际上不需要 a 在构造函数中完成工作,您可以使用属性 [OnDeserializing]
而不是 [OnDeserialized]
来完成工作 before反序列化而不是after.
[OnDeserializing]
private void SetValuesOnDeserializing(StreamingContext context)
{
// Code not shown.
}
注意:如果您的对象图中有多个 [OnDeserializing]
方法,则它们的调用顺序不是确定的。
我尝试通过数据协定序列化对自定义 class 进行序列化和反序列化。 序列化效果很好。但是,在反序列化时,我 运行 遇到了问题,因为这个 (source):
Constructors are not called when objects are deserialized.
问题是我在构造函数中做了一些初始化。 这包括一些数据结构。
如果不调用构造函数,数据结构是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)
{
}
并让您的 class 实施 ISerializable
。在序列化时,它在 de-serialization 上调用 ISerializable.GetObjectData()
,它调用上面的构造函数。
请参阅 MSDNCustom Serialization: Implementing the ISerializable Interface
如果您实际上不需要 a 在构造函数中完成工作,您可以使用属性 [OnDeserializing]
而不是 [OnDeserialized]
来完成工作 before反序列化而不是after.
[OnDeserializing]
private void SetValuesOnDeserializing(StreamingContext context)
{
// Code not shown.
}
注意:如果您的对象图中有多个 [OnDeserializing]
方法,则它们的调用顺序不是确定的。