首页 文章

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

提问于
浏览
2

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

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

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

3 回答

  • 0

    不,基本上 .

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

    如果您要编写自己的序列化代码,请选择:

    • 声明您自己的 [DataMember] -style属性并在运行时使用您自己的序列化代码解释它们

    • 使用"buddy class"

    • 使用外部元数据(例如文件)

    • 使用基于代码的配置(即通过DSL)

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

  • 2

    在过去的类似场景中,我们采用了面向对象的方法,并创建了一个从主类扩展的新类 . 为了帮助您实现对DataContractSerializer的干预,请查看KnownTypeAttribute

    在你对你的问题的一个评论中,

    如果同一个类正在实现多个接口,则某些数据元素可能只与其中一个接口相关 .

    如果在您的方案中就是这种情况,那么您的数据服务 Contract 应该只暴露接口而不是类?

    例如,如果你有一个类,如:

    [DataContract]
    public class DataObject : IRed, IBlue
    

    然后,您有两个操作 Contract ,一个用于IRed,另一个用于IBlue,而不是让您的操作 Contract 公开DataObject . 这消除了对自定义序列化代码的需要 .

  • 1

    有办法做到这一点,但这是一个丑陋的黑客 .

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

相关问题