【问题标题】:Deserialization from MemoryStream()从 MemoryStream() 反序列化
【发布时间】:2012-01-02 22:23:37
【问题描述】:

可以说,我有一个包含对象的类。

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());
}

Error: $exception{"反序列化类型对象的构造函数 'Class_Serialization.SerializeThisClass' 未找到。"} System.Exception {System.Runtime.Serialization.SerializationException}

【问题讨论】:

标签: c# .net serialization deserialization memorystream


【解决方案1】:

如果你正在实现ISerializable,你需要一个签名的构造函数:

protected YourType(SerializationInfo information, StreamingContext context) {}

加载数据(基本上是GetObjectData的反面)。据推测,使用(未经测试):

StreamThisData = (Data)info.GetValue("Object Data", typeof(Data));

【讨论】:

  • +1 虽然我知道遗漏了什么,但该死的,如果我能记住解释!大声笑
  • @JasimKhanAfridi 你的GetObjectData在序列化的时候使用,构造函数在反序列化的时候使用。正如 Marc 所说,它应该简单地将值从容器中提取到您的类中。
  • 好的。谢谢,我明白了。这很有帮助。
  • @JasimKhanAfridi 说真的,您几乎可以肯定不需要在这里实际实现 ISerializable。只是说'
  • @JasimKhanAfridi 其次,Marc 我见过的几乎所有ISerializable 实现都是由尚不了解序列化属性如何工作的新 c# 开发人员编写的。你几乎可以肯定在这里不需要它。如果股票序列化不适合您,请在实现 ISerializable 之前查看OnDeserializedAttribute
【解决方案2】:

尝试添加构造函数:

protected SerializeThisClass(SerializationInfo info, StreamingContext context)
{
}

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

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多