我要像这样对一个对象进行序列化:
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属性。序列化时,不会抛出任何错误,列表永远不会为空,但是当反序列化我的所有列表都为空时,我不确定原因。
我将此标记为CQ的回答。我能够生成一个小的测试应用程序,它正确地使用我正在尝试使用的对象进行序列化/反序列化但我仍然无法让它在我的生产代码中工作,但我怀疑它是小的我我失踪了。
答案 0 :(得分:5)
当你说你的列表为空时,你的意思是列表本身是空的,还是填充了空条目?如果是后者,则这是一个已知的.Net问题:请参阅my question同一问题。
基本上,List<T>
只在反序列化时才被初始化;它们包含的对象仅在反序列化对象图后进行反序列化。解决此问题的一种方法是在OnDeserialized
方法中放置需要它们的任何代码,或者使用[OnDeserializedAttribute]
放置一个代码。请参阅MSDN。
答案 1 :(得分:3)
首先列表总是空的,你是通过myClass.value = new List<...>();
设置的吗?您是否还以二进制和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]);
忘记输出..
序列化对象是754bytes
1:你好2:世界