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