Десериализация из MemoryStream () - PullRequest
1 голос
/ 21 ноября 2011

Допустим, у меня есть класс с объектами в нем.

namespace Class_Serialization
{
    [Serializable]
    public class Data
    {
        public string Name = "Example1";
        public string place = "Torino";
        public DateTime time = DateTime.Now;
    }
}

Я пытаюсь сериализовать его с помощью интерфейса ISerialization

[Serializable]
public class SerializeThisClass : ISerializable
{
    public Data StreamThisData;

    public SerializeThisClass()
    {

    }

    public SerializeThisClass(Data _StreamThisData)
    {
        StreamThisData = _StreamThisData;
    }
    [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Object Data", StreamThisData);
    }
}

Теперь, когда я сериализую с кодомниже

Data DataToSerialize = new Data();
BinaryFormatter DataToBinary = new BinaryFormatter();
SerializeThisClass serialize = new SerializeThisClass(DataToSerialize);
SerializeIn SerializeInMem = new SerializeIn();
DataToBinary.Serialize(SerializeInMem.StreamOfData, serialize);
ListOfStreams.Add(SerializeInMem);

Он сериализуется нормально, но когда я пытаюсь десериализовать его, он дает мне ошибку

BinaryFormatter BinaryToData = new BinaryFormatter();
foreach (SerializeIn x in ListOfStreams)
{
    x.StreamOfData.Position = 0;
    SerializeThisClass DeserializeData = (SerializeThisClass)BinaryToData.Deserialize(x.StreamOfData);
    MessageBox.Show("Name: " + DeserializeData.StreamThisData.Name + "\nPlace: " + DeserializeData.StreamThisData.place + "\nDateTime: " + DeserializeData.StreamThisData.time.ToString());
}

Ошибка: $ исключение {"Конструктор для десериализации объектатипа 'Class_Serialization.SerializeThisClass' не найден. "} System.Exception {System.Runtime.Serialization.SerializationException}

Ответы [ 2 ]

4 голосов
/ 21 ноября 2011

Если вы реализуете ISerializable, вам нужен конструктор подписи:

protected YourType(SerializationInfo information, StreamingContext context) {}

, который загружает данные (в основном наоборот GetObjectData). Предположительно, с (не проверено):

StreamThisData = (Data)info.GetValue("Object Data", typeof(Data));
1 голос
/ 21 ноября 2011

Попробуйте добавить конструктор:

protected SerializeThisClass(SerializationInfo info, StreamingContext context)
{
}

http://msdn.microsoft.com/en-us/library/ms182343(v=vs.80).aspx

...