混合自定义和基本序列化?

我有一个超过100个属性的类(它是一个数据库映射类),其中一个属性必须在一个方法中。 换句话说,这些数据不是通过属性公开,而是通过以下方法公开:

“ABCType GetABC(),SetABC(ABCType值)”

这一切都非常不像C#。 当我看到它时,我不寒而栗。

该类需要是可序列化的,因此可以通过Web服务发送,并且Get / Set方法公开的数据也需要序列化。 (这是一种方法,因为我正在使用的网格使用reflection进行奇怪的操作;它无法处理包含与包含对象相同类型的属性的对象.pronce属性将数据库对象的原始状态存储在需要恢复的情况。执行效率低,是的 – 但我无法对其进行重新设计。)

我的问题是:因为只有这1个字段需要自定义序列化代码,所以我只想使用自定义序列化来调用GetABC和SetABC,恢复到其他类的基本XML序列化。 它可以最大限度地减少序列化代码中的错误。 有办法吗?

我要尝试的第一件事是添加一个序列化属性,但将其隐藏在UI中:

[Browsable(false)] // hide in UI public SomeType ABC { get {return GetABC();} set {SetABC(value);} } 

不幸的是,你无法真正混合和匹配序列化; 一旦你实现IXmlSerializable ,你拥有一切 。 如果您使用的是WCF,那么DataContractSerialier支持非公共属性进行序列化,因此您可以使用:

 [DataMember] private SomeType ABC { get {return GetABC();} set {SetABC(value);} } 

但这不适用于通过XmlSerializer “asmx”Web服务。

[Browsable]技巧是否有效? 假设自定义网格使用TypeDescriptor ,另一个选项可能是通过ICustomTypeDescriptor隐藏它,但这只是隐藏属性的很多工作……