未找到用于反序列化T类型对象的构造函数

时间:2014-03-03 12:28:59

标签: c# .net windows

我试图承担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."}

1 个答案:

答案 0 :(得分:26)

是的,您需要为实现ISerializable的类型实现序列化构造函数;序列化构造函数负责反序列化对象,就像使用GetObjectData方法进行序列化一样。

序列化构造函数看起来像这样,第一个参数为SerializationInfo,第二个StreamingContext

protected ClassName(SerializationInfo info, StreamingContext context)
{

}

提供的链接中的备注部分讨论了该主题。

  

ISerializable接口意味着带有签名的构造函数   构造函数(SerializationInfo信息,StreamingContext上下文)。   在反序列化时,仅在之后调用当前构造函数   SerializationInfo中的数据已被反序列化   格式化。通常,如果构造函数应该受到保护   上课没有密封。