反序列化一个泛型列表返回 null

5

我正在进行对象的序列化/反序列化,方法如下:

public class myClass : ISerializable
{
  public List<OType> value;

  public myClass(SerializationInfo info, StreamingContext context)
  {
    this.value = (List<OType>)info.GetValue("value", typeof(List<OType>));
  }

  void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
  {
    info.AddValue("value", value, typeof(List<OType>));
  }
}

列表中的对象确实具有Serializable属性。在序列化时,不会抛出任何错误并且列表从未为空,但是在反序列化时,所有列表都为null,我不确定原因。
我将此标记为CQ已回答。我能够使用我尝试使用的对象生成一个小型一次性测试应用程序,该应用程序可以正确地进行序列化/反序列化,但我似乎仍无法使其在我的生产代码中正常工作,但我怀疑这是我遗漏的一些小细节。

也许 OType 不可序列化? - hova
我有一个类似的问题:http://stackoverflow.com/questions/1097797 - Agnel Kurian
2个回答

5
当你说你的列表是null时,你是指列表本身为null,还是填充了null条目?如果是后者,则这是一个已知的.NET问题:请参见同一问题上的我的问题
基本上,只有在反序列化时才会初始化List<T>;它们包含的对象只有在对象图被反序列化后才会反序列化。解决此问题的一种方法是将需要它们的任何代码放在一个OnDeserialized方法中,或者使用一个带有[OnDeserializedAttribute]的方法。请参见MSDN

3

一开始列表总是为空,你是通过 myClass.value = new List<...>(); 来设置它的吗?同时,你是否将序列化数据保存为二进制和xml格式,以便可以验证数据是否实际上已被保存?

还有一点需要注意的是,如果你使用2.0+版本,如果不需要控制绝对序列化,你不必实现ISerializable接口,只需将value更改为公共属性即可自动进行序列化。

编辑:对于我来说,以下情况似乎可以正常序列化和反序列化,我发布这篇文章是因为我可能误解了整个问题。

忽略糟糕的测试代码,希望这能有所帮助。

    [Serializable]
    public class OType
    {
        public int SomeIdentifier { get; set; }
        public string SomeData { get; set; }

        public override string ToString()
        {
            return string.Format("{0}: {1}", SomeIdentifier, SomeData);
        }
    }

    [Serializable]
    public class MyClass : ISerializable
    {
        public List<OType> Value;

        public MyClass() {  }

        public MyClass(SerializationInfo info, StreamingContext context)
        {
            this.Value = (List<OType>)info.GetValue("value", typeof(List<OType>));
        }

        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("value", Value, typeof(List<OType>));
        }
    }

...

        var x = new MyClass();

        x.Value = new OType[] { new OType { SomeIdentifier = 1, SomeData = "Hello" }, new OType { SomeIdentifier = 2, SomeData = "World" } }.ToList();

        var xSerialized = serialize(x);

        Console.WriteLine("Serialized object is {0}bytes", xSerialized.Length);

        var xDeserialized = deserialize<MyClass>(xSerialized);

        Console.WriteLine("{0} {1}", xDeserialized.Value[0], xDeserialized.Value[1]);

忘记输出了...

序列化对象为754字节

1:你好 2:世界


我需要实现ISerializable,因为我正在序列化一些位图(未显示),而且您无法直接以简单的方式序列化位图而不出现GDI错误。正如我所说,该列表从未为空。另外:我没有以XML格式序列化数据。我会研究一下它。 - Steven Evers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接