Подтвердить что ты не робот

Конструктор десериализации объекта типа T не найден

Я попытался взять на себя ISERializable и преуменьшить это. Я сделал два класса с атрибутом "Serializable". Только один класс получен из ISerializable и для него определен GetObjectData. Назовем этот класс A. Другой не был получен из ISerializable там GetObjectData для этого не был определен. Назовем этот класс как B. Я не предоставлял никакого специального конструктора для класса A. Теперь в классе выполнения A появляется ошибка, например "Специальный конструктор отсутствует". Синтаксис одинаковый для обоих классов. Таким образом, ошибка может быть какой-то другой, но она не должна относиться к конструктору. В противном случае я должен получить ту же ошибку для класса B тоже. См. Код ниже. Может ли кто-нибудь сказать причину этого?
Примечание. Я использую Windows 7 - 64 бит с визуальной студией 2010.

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."}
4b9b3361

Ответ 1

Да, вам нужно реализовать конструктор Serialization для типов, реализующих ISerializable; этот конструктор сериализации отвечает за десериализацию объекта, как это было сделано для сериализации, используя метод GetObjectData.

Конструктор сериализации будет выглядеть примерно так: первый параметр SerializationInfo и второй StreamingContext.

protected ClassName(SerializationInfo info, StreamingContext context)
{

}

Раздел замечаний в предоставленной ссылке рассказывает об этой теме.

Интерфейс ISerializable подразумевает конструктор с сигнатурой конструктор (информация SerializationInfo, контекст StreamingContext). При времени десериализации текущий конструктор вызывается только после данные в SerializationInfo были десериализованы форматировщик. В общем, этот конструктор должен быть защищен, если класс не запечатан.