我有一个自定义的抽象基类,其子类我可以使用iSerializizable序列化/可掩盖。当我对此类子类的单个实例进行序列化/避难所化时,一切正常。但是,当我做一个数组时,我总是最终以避免化的一系列空作用。序列化是通过二进制形式进行的。

这些项目包含在A中:

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

关于序列化,这是在serializationinfo参数上的getObjectData中完成的:

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

在避难化时,这是在序列化构造函数中完成的,也可以在序列化参数上进行:

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());
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top