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

时间:2010-12-02 20:37:12

标签: c# arrays deserialization iserializable

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

这些项目包含在:

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

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

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

反序列化总是给我一个空数组,正如我前面提到的,单个项目序列化和deseriaizes就好了:

序列化(GetObjectData方法):

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

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:11)

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

并且想要在某些方法上使用[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());
    }
}