混合自定义和基本序列化?
我有一个超过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
隐藏它,但这只是隐藏属性的很多工作……