0

私は次の設定をしています:

[Serializable]
public class TickerSymbol : ISerializable
{
    public readonly string Symbol;

    public TickerSymbol(string Symbol)
    {
        this.Symbol = Symbol;
    }

    protected TickerSymbol(SerializationInfo info, StreamingContext context)
    {
        // Call Order: 3
        Symbol = info.GetString("Symbol");
    }

    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue<string>("Symbol", Symbol);
    }

    [OnDeserialized]
    public void OnDeserialized(StreamingContext context)
    {
        // Call Order: 1
        // Do something that requires the symbol to not be null
    }
}

[Serializable]
public class EquitySymbol : TickerSymbol, ISerializable
{
    public EquitySymbol(stirng Symbol)
        : base(Symbol)
    {
    }

    protected EquitySymbol(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
        // Call Order: 4
    }

    public override void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        base.GetObjectData(info, context);
    }

    [OnDeserialized]
    public void OnDeserialized(StreamingContext context)
    {
        // Call order 2
    }
}

[OnDeserialized] でマークされたメソッドがそれぞれのシリアル化コンストラクターの後に呼び出されることを期待していましたが、シリアル化コンストラクターの前に呼び出されているように見えます-これはどのように機能するはずですか??

ウィリアム

4

1 に答える 1

1

可能な解決策はSymbol、フィールドではなくプロパティを作成することです。次に、 のセッターで必要なアクションを実行できますSymbol。たとえば、次のようになります。

private string _symbol;

public string Symbol {
    get { return _symbol; }
    set { 
        _symbol = value;
        if (_symbol != null ) {
            // here the _symbol is right after deserialization,
            // and it is certainly not null
        }
    }
}

また、一般に、.NET でパブリック フィールドを公開することはお勧めしません。これは、フィールドがほとんどの場合、インターフェイス コンストラクトではなく実装の詳細と見なされるためです。詳細については、次のリソースを参照してください。

C#でパブリックフィールドを受け入れないのはなぜですか? - StackOverflow に関する素晴らしいディスカッション

CA1051: 可視インスタンス フィールドを宣言しないで ください http://msdn.microsoft.com/en-us/library/ms182141.aspx - 問題に関する Microsoft の説明

于 2012-07-06T09:07:33.927 に答える