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 对私有属性进行(反)序列化?
我可以让 XmlSerializer 在反序列化时忽略命名空间吗?