Конструктор для десериализации объекта типа T не найдено
Я попытался undertand ISerializable и остановился на этом. Я сделал два класса с атрибутом "Serializable". Только один класс является производным от ISerializable и GetObjectData был определен для него. Назовем этот класс A. другой не был производным от ISerializable там GetObjectData не был определен для этого. Давайте назовем этот класс как B. Я не предоставил никакого специального конструктора для класса A. Теперь во время выполнения класс A показывает ошибку, такую как " специальный конструктор недостающий." Синтаксис одинаков для обоих классов. Таким образом, ошибка может быть какой-то другой, но она не должна касаться конструктора. В противном случае я должен получить ту же ошибку для класса B тоже. См. код ниже. Кто-нибудь может сказать причину?
Примечание: я использую бит windows 7 - 64 с visual studio 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."}
1 ответов
да, вам нужно реализовать конструктор сериализации для типов, реализующих ISerializable; этот конструктор сериализации отвечает за десериализацию объекта, как это было для сериализации с помощью GetObjectData
метод.
конструктор сериализации будет выглядеть примерно так, с первым параметром SerializationInfo
и второй StreamingContext
.
protected ClassName(SerializationInfo info, StreamingContext context)
{
}
Примечания раздел в предоставленной ссылке рассказывает об этой теме.
в Интерфейс ISerializable подразумевает конструктор с сигнатурой конструктор (информация SerializationInfo, StreamingContext контекстные). Во время десериализации текущий конструктор вызывается только после данные в SerializationInfo были десериализованы форматер. В общем, этот конструктор должен быть защищен, если класс не запечатан.