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's setter 中执行所需的操作,例如:

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 回答