1

我尝试通过数据合同序列化来序列化和反序列化自定义类。 序列化效果很好。但是,当反序列化时,我遇到了一个问题,因此(source):如何在反序列化之前调用构造函数?

对象反序列化时不调用构造函数。

事情是,我在构造函数中做了一些初始化。 这包括一些数据结构。

没有对构造函数的调用,数据结构为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; 
} 

但是看起来他们都是的deserialisation后触发

是否必须切换到XML序列化?

+1

在应用程序序列化之前,这应该已经发生了。所以再这样做会是错误的。 –

+0

是的,使用'OnDeserialized'方法可以初始化字段。在此之前,没有人可以访问字段/属性。 –

+0

@HansPassant反序列化独立发生。在程序的执行过程中,我只加载序列化数据并想将其反序列化为一个对象。在反序列化之前甚至没有发生序列化(在这个程序的例子中)。我不太确定在此之前我将如何调用构造函数。 – null

回答

3

与签名

protected YourClassName(SerializationInfo info, StreamingContext context) 
{ 
} 

创建一个构造函数,让你的类实现ISerializable。在序列化时,它调用ISerializable.GetObjectData()去反序列化它调用上述构造函数。

Custom Serialization: Implementing the ISerializable Interface在MSDN

如果你实际上并不需要做在构造函数中工作,你可以使用属性[OnDeserializing]而不是[OnDeserialized]来完成工作反序列化,而不是之后。

[OnDeserializing] 
private void SetValuesOnDeserializing(StreamingContext context) 
{ 
    // Code not shown. 
} 

注意:如果你在你的对象图,他们被称为顺序有不止一个[OnDeserializing]方法不dertimistic。

+0

[文档说谎](https://msdn.microsoft.com/en-us/library/6exf3h2k(v = vs.110).aspx)“*任何给定的类型都可以支持none,one或更多的序列化技术。*“,因为我无法同时实现'ISerializable'并使用'DataContractAttribute',另一方面'[OnDeserializing]'效果很好。 – null

相关问题