C#:有没有一种方法可以从属性集中确定我们当前是否处于反序列化模式?

我不想计算位置或抛出异常,因为这些值是相互检查和设置的( inter- NOT > ind-)。如果该值已序列化,那么我知道它是有效值,因此,如果要在反序列化过程中,我想绕过CalcNewPositions调用。有没有办法知道我们当前是否处于反序列化模式?否则,由于尚未设置其中一个值,因此将引发异常。 (在序列化之外初始化时,我们使用_x_y的两个有效值进行初始化。)

[DataContract]
Class Foo{
    ...
    [DataMember]
    public double X
    {
        get { return _x; }
        set
        {
            // I WANT TO BYPASS THIS IF WE'RE MID-DESERIALIZATION
            if (!CalcNewPositions(value,_y))
            {
                throw new ArgumentOutOfRangeException(value + " Out of Bounds: ");
            }

            _x = value;
            _lastGoodX = value;
        }
    }

    [DataMember]
    public double Y
    {
        get { return _y; }
        set
        {
            // I WANT TO BYPASS THIS IF WE'RE MID-DESERIALIZATION
            if (!CalcNewPositions(_x,value))
            {

                throw new ArgumentOutOfRangeException(value + " Out of Bounds: ");
            }

            _y = value;
            _lastGoodY = value;
        }
    }
    ...
}

编辑:

随着我进行更多的研究,我首先想到的是尝试使用ISerializable设置一个字段,以后我可以检查X和Y的设置器:

[DataContract]
[Serializable]
Class Foo : ISerializable {
    ...
    protected Foo(SerializationInfo info,StreamingContext context)
    {
        _deserializing = true;
    }
    ...
}

但是我遇到了异常Type 'Foo' cannot be ISerializable and have DataContractAttribute attribute。由于该项目目前在所有地方都使用DataContract,所以我认为我不能走那条路。

gangan123321 回答:C#:有没有一种方法可以从属性集中确定我们当前是否处于反序列化模式?

使用OnDeserializing()OnDeserialized()属性。在课堂上这样做:

private bool _deserializing;

[OnDeserializing()]
internal void OnDeserializing(StreamingContext context)
{
    _deserializing = true;
}

[OnDeserialized()]
internal void OnDeserialized(StreamingContext context)
{
    // do validations of the values here once they're both set

    _deserializing = false;
}

public double X
{
    get { return _x; }
    set
    {
        if (!_deserializing)
        {
            if (!CalcNewPositions(value,_y))
            {
                throw new ArgumentOutOfRangeException(value + " Out of Bounds: ");
            }
        }

        _x = value;
        _lastGoodX = value;
    }
}
...
本文链接:https://www.f2er.com/3106029.html

大家都在问