gpt4 book ai didi

c# - 数组的反序列化总是给出一个空数组

转载 作者:太空狗 更新时间:2023-10-29 17:47:16 26 4
gpt4 key购买 nike

我有一个带有子类的自定义抽象基类,我已经使用 ISerializable 使其可序列化/可反序列化。当我对此类的子类的单个实例进行序列化/反序列化时,一切正常。但是,当我做一个数组时,我总是在反序列化时得到一个空数组。序列化是使用 BinaryFormatter 完成的。

项目包含在:

public ObservableCollection<Trade> Trades { get; private set; }

在序列化时,这是在 GetObjectData 中的 SerializationInfo 参数上完成的:

Trade[] trades = (Trade[])Trades.ToArray<Trade>();
info.AddValue("trades", trades);

在反序列化时,这是在序列化构造函数中完成的,也是在 SerializationInfo 参数上完成的:

Trade[] trades = (Trade[])info.GetValue("trades", typeof(Trade[]));

foreach (Trade t in trades)
{
Trades.Add(t);
}

反序列化总是给我一个空值数组,正如我之前提到的,单个项目序列化和反序列化与此代码很好:

序列化(GetObjectData 方法):

info.AddValue("trade", Trades.First<Trade>());

反序列化(序列化构造函数):

Trade t = (Trade)info.GetValue("trade", typeof(Trade));
Trades.Add(t);

这是一个常见问题吗?我似乎至少没有发现任何其他人遇到过它。希望有一个解决方案 :) 如果我需要为您提供更多信息/代码,请告诉我。

谢谢!

最佳答案

数组首先反序列化。然后完成所有内部反序列化。因此,当您尝试访问项目时,它们为空。

以及在某些方法上使用 [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());
}
}

关于c# - 数组的反序列化总是给出一个空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4339602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com