ves*_*esz 9 c# arrays iserializable deserialization
我有一个带有子类的自定义抽象基类,我已经使用ISerializable进行了可序列化/可序列化.当我对这个类的子类的单个实例进行序列化/反序列化时,一切正常.但是,当我做一个数组时,我总是在反序列化时得到一个空数组.使用BinaryFormatter完成序列化.
这些项目包含在:
public ObservableCollection<Trade> Trades { get; private set; }
Run Code Online (Sandbox Code Playgroud)
在序列化时,这是在SerializationInfo参数的GetObjectData中完成的:
Trade[] trades = (Trade[])Trades.ToArray<Trade>();
info.AddValue("trades", trades);
Run Code Online (Sandbox Code Playgroud)
在反序列化时,这也是在SerializationInfo参数的序列化构造函数中完成的:
Trade[] trades = (Trade[])info.GetValue("trades", typeof(Trade[]));
foreach (Trade t in trades)
{
Trades.Add(t);
}
Run Code Online (Sandbox Code Playgroud)
反序列化总是给我一个空数组,正如我前面提到的,单个项目序列化和deseriaizes与这段代码很好:
序列化(GetObjectData方法):
info.AddValue("trade", Trades.First<Trade>());
Run Code Online (Sandbox Code Playgroud)
反序列化(序列化构造函数):
Trade t = (Trade)info.GetValue("trade", typeof(Trade));
Trades.Add(t);
Run Code Online (Sandbox Code Playgroud)
这是个常见的问题吗?我似乎发现至少没有其他任何人参与其中.希望有一个解决方案:)如果我需要为您提供更多信息/代码,请告诉我.
谢谢!
The*_*est 11
数组首先反序列化.然后完成所有内部反序列化.因此,当您尝试访问项目时,它们为空.
并且想法[OnDeserialized]在某些方法上使用属性,这构建了所有其他属性.这是一个例子:
[Serializable]
public class TestClass : ISerializable
{
private Trade[] _innerList;
public ObservableCollection<Trade> List { get; set; }
public TestClass()
{ }
[OnDeserialized]
private void SetValuesOnDeserialized(StreamingContext context)
{
this.List = new ObservableCollection<Trade>(_innerList);
this._innerList = null;
}
protected TestClass(SerializationInfo info, StreamingContext context)
{
var value = info.GetValue("inner", typeof(Trade[]));
this._innerList = (Trade[])value;
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("inner", this.List.ToArray());
}
}
Run Code Online (Sandbox Code Playgroud)