【问题标题】:deserializing a generic list returns null反序列化通用列表返回 null
【发布时间】:2009-02-05 18:00:20
【问题描述】:

我正在像这样反序列化一个对象:

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

列表中的对象确实具有Seri​​alizable 属性。序列化时,不会抛出任何错误并且列表从不为空,但是在反序列化时我的所有列表都是空的,我不知道为什么。

我将此标记为 CQ 已回答。我能够生成一个小型的一次性测试应用程序,它可以正确序列化/反序列化我正在尝试使用的对象,但我似乎仍然无法让它在我的生产代码中工作,但我怀疑这是我的小事我失踪了。

【问题讨论】:

标签: c# serialization binary-serialization


【解决方案1】:

当你说你的列表为空时,你的意思是列表本身是空的,还是它填充了空条目?如果是后者,那么这是一个已知的 .Net 问题:请参阅 my question 了解同一问题。

基本上List&lt;T&gt;s只有在反序列化时才会初始化;它们包含的对象仅在对象图被反序列化后才被反序列化。解决此问题的一种方法是将任何需要它们的代码放入OnDeserialized 方法中,或者使用[OnDeserializedAttribute] 方法。见MSDN

【讨论】:

    【解决方案2】:

    列表一开始总是空的,你是通过myClass.value = new List&lt;...&gt;(); 设置的吗?您是否还以二进制和 xml 格式保存了序列化数据,以便验证数据是否实际保存?

    请注意,如果您使用的是 2.0+,如果您不需要控制绝对序列化,则不必实现 ISerializable,您可以将值更改为公共属性,它会自行序列化.

    编辑:以下案例似乎对我来说可以序列化和反序列化,我发布这个以防我误解了整个问题。

    忽略讨厌的测试代码,希望这会有所帮助。

        [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:世界

    【讨论】:

    • 我需要实现可序列化,因为我正在序列化一些位图(未显示),并且您无法以简单的方式直接序列化位图而不会出现 gdi 错误。就像我说的,列表从不为空。另外:我还没有序列化xml格式的数据。会调查的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多