我试图承担ISerializable并且难以接受。我使用属性“Serializable”创建了两个类。只有一个类派生自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."}
答案 0 :(得分:26)
是的,您需要为实现ISerializable的类型实现序列化构造函数;序列化构造函数负责反序列化对象,就像使用GetObjectData
方法进行序列化一样。
序列化构造函数看起来像这样,第一个参数为SerializationInfo
,第二个StreamingContext
。
protected ClassName(SerializationInfo info, StreamingContext context)
{
}
提供的链接中的备注部分讨论了该主题。
ISerializable接口意味着带有签名的构造函数 构造函数(SerializationInfo信息,StreamingContext上下文)。 在反序列化时,仅在之后调用当前构造函数 SerializationInfo中的数据已被反序列化 格式化。通常,如果构造函数应该受到保护 上课没有密封。