让DataContractSerializer以两种不同的方式序列化同一个类?

时间:2009-05-05 13:15:53

标签: c# .net wcf

我正在使用DataContractSerializer将对象属性和标有DataMember属性的字段序列化为xml。

现在有一个同一个类的另一个用例,我需要序列化其他属性和其他字段。

有没有办法添加可用于其他序列化方案的“另一个DataMemberAttribute”?

3 个答案:

答案 0 :(得分:2)

不,基本上。

如果您想使用现有的DataContractSerializer,则必须维护DTO类的第二个版本并在它们之间转换数据。

如果您正在编写自己的序列化代码,则选项:

  • 声明您自己的[DataMember] - 样式属性,并在运行时使用您自己的序列化代码解释它们
  • 使用“伙伴类”
  • 使用外部元数据(例如文件)
  • 使用基于代码的配置(即通过DSL)

实际上,我预计第一个将是最简单的选择。

答案 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类的第二个版本会更清晰。