【问题标题】:Change XML Namespace of DataMember更改 DataMember 的 XML 命名空间
【发布时间】:2013-06-12 13:46:18
【问题描述】:

我有两个 DataContracts,我使用 DataContractSerializer 将它们序列化为 XML。

我为两个不同的DataContracts 指定了不同的命名空间,但是,每个DataContract 中都有一个DataMember,它属于相同的POD 类型。此 POD 位于不同的 c# 命名空间中。

我想知道是否有一种方法可以根据它所属的包含类型来指定用于此 DataMember 的命名空间。

例如:

namespace NamespaceShared
{
    using System.Runtime.Serialization;

    [DataContract]
    public sealed class SharedType
    {
        [DataMember(IsRequired = true)]
        public int ValueOne { get; set; }

        [DataMember(IsRequired = true)]
        public int ValueTwo { get; set; }
    }
}

namespace NamespaceOne
{
    using System.Runtime.Serialization;
    using NamespaceShared;

    [DataContract(Namespace = "http://namespace.one")]
    public sealed class DataContractOne
    {
        [DataMember(IsRequired = true)]
        //[SomeNamespaceAttribute("http://namespace.one")]
        private SharedType SharedValue { get; set; }
    }
}

namespace NamespaceTwo
{
    using System.Runtime.Serialization;
    using NamespaceShared;

    [DataContract(Namespace = "http://namespace.two")]
    public sealed class DataContractTwo
    {
        [DataMember(IsRequired = true)]
        //[SomeNamespaceAttribute("http://namespace.two")]
        private SharedType SharedValue { get; set; }
    }
}

我正在寻找可以在上面的代码中提供SomeNamespaceAttribute 功能的东西。

注意:我不是在寻找如何更好地组织我的 DataContracts 的建议,因为不幸的是我正在重构遗留代码并且 XML 格式无法更改。

【问题讨论】:

  • 是否可以选择切换到 XmlSerializer? XmlElementAttribute 具有指定命名空间的选项。
  • 很遗憾没有。但是感谢您指出这一点。
  • 想要更改命名空间的原因是什么?你想改变什么?
  • 我正在处理一些遗留代码,不想更改现有的 XML 模式。但是我想在新的命名空间中重用一些现有的对象。

标签: c# xml xml-serialization datacontractserializer


【解决方案1】:

DataContractSerializer 没有公开对 XML 生成的细粒度控制,因此这种属性本质上是不可用的。但是,您可以使用具有不同命名空间的两个不同的 DataContract 属性对共享类进行子类化(假设您可以摆脱 sealed 访问修饰符)。

namespace NamespaceShared
{
    using System.Runtime.Serialization;

    public class SharedType
    {
        [DataMember(IsRequired = true)]
        public int ValueOne { get; set; }

        [DataMember(IsRequired = true)]
        public int ValueTwo { get; set; }
    }

    [DataContract(Namespace = "http://namespace.one")]
    public class SharedTypeOne : SharedType
    {
    }

    [DataContract(Namespace = "http://namespace.two")]
    public class SharedTypeTwo : SharedType
    {
    }
}

namespace NamespaceOne
{
    using System.Runtime.Serialization;
    using NamespaceShared;

    [DataContract(Namespace = "http://namespace.one")]
    public sealed class DataContractOne
    {
        [DataMember(IsRequired = true)]
        private SharedTypeOne SharedValue { get; set; }
    }
}

namespace NamespaceTwo
{
    using System.Runtime.Serialization;
    using NamespaceShared;

    [DataContract(Namespace = "http://namespace.two")]
    public sealed class DataContractTwo
    {
        [DataMember(IsRequired = true)]
        private SharedTypeTwo SharedValue { get; set; }
    }
}

如果一切都失败了,您可以使用类似于用于更改自动生成前缀的技术来编辑来自服务的原始 XML。 This MSDN blog post详细介绍了整个过程。

【讨论】:

  • 没有解决这个问题,但它可能是正确的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多