質問

Sub Classesを備えたカスタム抽象的なベースクラスがあり、IserializableでSerializable/DeseriaBlizableを作成しました。このクラスのサブクラスの単一のインスタンスのシリアル化/脱着を行うと、すべてが正常に機能します。しかし、それらの配列を行うとき、私は常に脱派化に関するヌルの配列になります。シリアル化はBinaryFormatterで行われます。

アイテムは以下に含まれています。

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

シリアル化では、これはgetObjectDataでserializationinfoパラメーターで行われます。

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

そして、これは脱皮化について、シリアル化コンストラクターでもシリアル化Infoパラメーターで行われます。

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

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

脱皮化は常に私にヌルの配列を与えます、そして、先に述べたように、単一のアイテムはこのコードをシリアル化し、脱脂します:

シリアル化(getObjectDataメソッド):

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

Deserialization(シリアル化コンストラクター):

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

これは一般的な問題ですか?少なくとも他の人が走っている人の出来事は見つからないようです。うまくいけば、解決策があります:)そして、私があなたにもっと情報/コードを提供する必要があるならば、私に教えてください。

ありがとう!

役に立ちましたか?

解決

アレイは最初に降下します。その後、すべての内なる脱3が行われます。したがって、アイテムにアクセスしようとすると、それらはヌルです。

そして、使用するアイデア [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