我有一个超过100个属性的类(它是一个数据库映射类),其中一个属性必须在一个方法中。换句话说,这些数据不是通过属性公开,而是通过方法公开:
“ABCType GetABC(),SetABC(ABCType值)”
这一切都非常不像C#。我看到它时会不寒而栗。
该类需要是可序列化的,因此可以通过Web服务发送,并且Get / Set方法公开的数据也需要序列化。 (这是一种方法,因为我正在使用的网格使用反射进行奇怪的操作;它无法处理包含与包含对象相同类型的属性的对象.pronce属性将数据库对象的原始状态存储在需要恢复的情况。执行效率低,是的 - 但我无法重新设计它。)
我的问题是:因为只有这1个字段需要自定义序列化代码,所以我只想使用自定义序列化来调用GetABC和SetABC,恢复到其他类的基本XML序列化。它可以最大限度地减少序列化代码中的错误。有办法吗?
答案 0 :(得分:2)
我要尝试的第一件事是添加一个序列化属性,但将其隐藏在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”网络服务。
[Browsable]
技巧是否有效?假设自定义网格使用TypeDescriptor
,另一个选项可能是通过ICustomTypeDescriptor
隐藏它,但这只是隐藏属性的很多工作......