C# 混合自定义和基本序列化?
我有一个拥有100多个属性的类(这是一个数据库映射类),其中一个属性必须在一个方法中。换句话说,该数据不是通过属性公开的,而是通过方法公开的: ABCType GetABC(),SetABC(ABCType值) 这一切都很不正常。我一看到它就发抖 该类需要可序列化,以便可以通过web服务发送,并且Get/Set方法公开的数据也需要序列化。(这是在一个方法中,因为我使用的网格在反射方面做了一件奇怪的事情;它无法处理包含与包含对象相同类型属性的对象。problem属性存储数据库对象的原始状态,以防需要还原。是的,实现效率低下-但我无法重新设计它。)C# 混合自定义和基本序列化?,c#,xml,serialization,C#,Xml,Serialization,我有一个拥有100多个属性的类(这是一个数据库映射类),其中一个属性必须在一个方法中。换句话说,该数据不是通过属性公开的,而是通过方法公开的: ABCType GetABC(),SetABC(ABCType值) 这一切都很不正常。我一看到它就发抖 该类需要可序列化,以便可以通过web服务发送,并且Get/Set方法公开的数据也需要序列化。(这是在一个方法中,因为我使用的网格在反射方面做了一件奇怪的事情;它无法处理包含与包含对象相同类型属性的对象。problem属性存储数据库对象的原始状态,以防需
我的问题是:因为只有这个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
隐藏它,但仅仅隐藏属性就需要大量的工作…可浏览]技巧不起作用,因为它不会从网格对typeof(SomeType)的调用中隐藏属性。GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);但是您确实回答了关于混合序列化的问题,所以谢谢!