10

ISerializable でシリアライズ可能/デシリアライズ可能にしたサブクラスを持つカスタム抽象基本クラスがあります。このクラスのサブクラスの単一インスタンスのシリアル化/逆シリアル化を行うと、すべて正常に動作します。ただし、それらの配列を実行すると、逆シリアル化で常に null の配列になります。シリアル化は 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);
            }

逆シリアル化では常に null の配列が得られます。前述したように、次のコードで 1 つのアイテムを正しくシリアル化および逆シリアル化します。

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

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

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

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

これはよくある問題ですか?少なくとも他の誰かがそれに遭遇したことはないようです。解決策があることを願っています :) より多くの情報/コードを提供する必要がある場合は、教えてください。

ありがとう!

4

1 に答える 1

12

配列が最初に逆シリアル化されます。次に、すべての内部逆シリアル化が行われます。したがって、アイテムにアクセスしようとすると、それらは null になります。

そして[OnDeserialized]、他のすべてのプロパティを構築する何らかのメソッドで Attribute を使用するというアイデア。そして、ここに例があります:

[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());
    }
}
于 2010-12-02T20:56:07.947 に答える