我尝试着去尝试一下这个不可思议的东西。 我做了两个具有“可序列化”属性的类。 只有一个类从ISerializable派生,并为其定义了GetObjectData。 让我们调用这个类A.另一个不是从ISerializable那里派生出来的,GetObjectData没有为它定义。 让我们称这个类为B.我没有提供任何特殊的类A的构造函数。现在在运行时类A显示错误,如“特殊构造函数丢失”。 这两个类的语法都是一样的。 所以,错误可能是一些其他的事情,但它不应该是关于构造函数。 否则,我也应该得到类B的同样的错误。 请参阅下面的代码。 有人可以说背后的原因吗?
注:我正在使用Visual Studio 2010的Windows 7 – 64位。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.IO; namespace Delete_This { [Serializable] class After_Implementing_ISerializable:ISerializable { int a; string b; public After_Implementing_ISerializable(int a, string b) { this.a = a; this.b = b; } public void GetObjectData(SerializationInfo info, StreamingContext context) { } public void Check() { After_Implementing_ISerializable s = new After_Implementing_ISerializable(15, "100"); FileStream fs = new FileStream("temp.xml", FileMode.OpenOrCreate); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, s); fs.Close(); fs = new FileStream("temp.xml", FileMode.OpenOrCreate); After_Implementing_ISerializable d = (After_Implementing_ISerializable)bf.Deserialize(fs); fs.Close(); } } [Serializable] class Without_Implementing_ISerializable { int a; string b; public Without_Implementing_ISerializable(int a,string b) { this.a = a; this.b = b; } public void Check() { Without_Implementing_ISerializable s = new Without_Implementing_ISerializable(15, "100"); FileStream fs = new FileStream("temp.xml", FileMode.OpenOrCreate); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, s); fs.Close(); fs = new FileStream("temp.xml", FileMode.OpenOrCreate); Without_Implementing_ISerializable d = (Without_Implementing_ISerializable)bf.Deserialize(fs); fs.Close(); } } class Program { static void Main(string[] args) { Without_Implementing_ISerializable s = new Without_Implementing_ISerializable(5,"Five"); s.Check(); After_Implementing_ISerializable s1 = new After_Implementing_ISerializable(6, "Six"); s1.Check(); } } }
这是我得到的错误
"The constructor to deserialize an object of type 'Delete_This.After_Implementing_ISerializable' was not found."}
是的,您需要为实现ISerializable的类型实现序列化构造函数; 该序列化构造函数负责反序列化对象,就像使用GetObjectData
方法进行序列化一样。
序列化构造函数看起来像这样,带有第一个参数SerializationInfo
和第二个StreamingContext
。
protected ClassName(SerializationInfo info, StreamingContext context) { }
在提供的链接的备注部分谈论这个话题。
ISerializable接口意味着具有签名构造函数(SerializationInfo信息,StreamingContext上下文)的构造函数。 在反序列化的时候,只有在格式化程序将SerializationInfo中的数据反序列化之后才调用当前的构造函数。 一般来说,如果这个类没有被封装,这个构造函数应该被保护。