我正在使用DataContractSerializer将对象属性和标有DataMember属性的字段序列化为xml。
现在有一个同一个类的另一个用例,我需要序列化其他属性和其他字段。
有没有办法添加可用于其他序列化方案的“另一个DataMemberAttribute”?
答案 0 :(得分:2)
不,基本上。
如果您想使用现有的DataContractSerializer
,则必须维护DTO类的第二个版本并在它们之间转换数据。
如果您正在编写自己的序列化代码,则选项:
[DataMember]
- 样式属性,并在运行时使用您自己的序列化代码解释它们实际上,我预计第一个将是最简单的选择。
答案 1 :(得分:1)
在过去的类似场景中,我们采用了面向对象的方法,并创建了一个从主类扩展的新类。 为了帮助您实现对DataContractSerializer的干预,请查看KnownTypeAttribute
在你对你的问题的一个评论中,
如果同一个类正在实现多个接口,则某些数据元素可能只与其中一个接口相关。
如果在您的方案中就是这种情况,那么您的数据服务合同应该只暴露接口而不是类?
例如,如果你有一个类:
[DataContract]
public class DataObject : IRed, IBlue
然后,不是让你的操作合同暴露DataObject,你有两个操作合同,一个用于IRed,另一个用于IBlue。
这消除了对自定义序列化代码的需求。
答案 2 :(得分:0)
有办法做到这一点,但这是一个丑陋的黑客。
DataContractSerializer
可以序列化实现IXmlSerializable
接口的对象。您可以实现该接口并创建自己的ReadXml(XmlReader reader)
和WriteXml(XmlWriter writer)
方法,这些方法可以以不同方式序列化对象。
请注意,您必须在类本身中嵌入一个标志,以确定序列化对象的方法。 (没有办法告诉DataContractSerializer
使用哪种模式,因此标志必须包含在对象本身中。)
正如@Marc建议的那样,DTO类的第二个版本会更清晰。