反序列化通用列表返回null

我正在/像这样对一个对象进行序列化:

public class myClass : ISerializable { public List value; public myClass(SerializationInfo info, StreamingContext context) { this.value = (List)info.GetValue("value", typeof(List)); } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("value", value, typeof(List)); } } 

列表的对象具有Seri​​alizable属性。 序列化时,不会抛出任何错误,列表永远不会为空,但是当反序列化我的所有列表都为空时,我不知道为什么。

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

那么列表总是空的,你是通过myClass.value = new List<...>(); ? 您是否还以二进制和xml格式保存了序列化数据,以便validation数据是否实际保存?

只需注意,如果您使用的是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 Value; public MyClass() { } public MyClass(SerializationInfo info, StreamingContext context) { this.Value = (List)info.GetValue("value", typeof(List)); } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("value", Value, typeof(List)); } } ... 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(xSerialized); Console.WriteLine("{0} {1}", xDeserialized.Value[0], xDeserialized.Value[1]); 

忘了输出..

序列化对象是754字节

1:你好2:世界

当你说你的列表为空时,你的意思是列表本身是null,还是填充为null entires? 如果是后者,那么这是一个已知的.Net问题:看看我对同一问题的疑问 。

基本上, List仅在它们被去序列化时被初始化; 它们包含的对象仅在反序列化对象图后进行反序列化。 解决这个问题的一种方法是在OnDeserialized方法中放置任何需要它们的代码,或者在[OnDeserializedAttribute]放置一个代码。 请参阅MSDN 。