C#:是否可以从属性集中确定当前是否处于反序列化模式?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
    {
        _serializing = true;
    }
    ...
}

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

我不想计算位置或引发异常,因为这些值是相互检查(并且相互之间不是IND-)设置的。如果该值已序列化,我知道它是有效的...

答案

使用OnDeserializing()属性。在类中添加执行此操作:

以上是关于C#:是否可以从属性集中确定当前是否处于反序列化模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 Skype 通话当前是不是在 Android 上处于活动状态

是否可以在 Silverlight 中使用 protobuf-net 对私有属性进行(反)序列化?

是否可以在 C++ 中序列化和反序列化一个类?

我可以让 XmlSerializer 在反序列化时忽略命名空间吗?

是否有可能在反序列化时以某种方式捕获与任何 POCO 属性不匹配的 JSON 数据的其余部分?

窗体的基本属性