更改DataMember的XML命名空间

时间:2013-06-12 13:46:19

标签: c# xml xml-serialization datacontractserializer

我有两个DataContract我使用DataContractSerializer序列化为XML。

我为两个不同的DataContract指定了不同的命名空间,但每个DataMember中有一个DataContract,它具有相同的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功能的东西。

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

1 个答案:

答案 0 :(得分:1)

DataContractSerializer不会对XML生成进行细粒度控制,因此这种属性本身并不可用。但是,您可以将共享类子类化(假设您可以删除sealed访问修饰符),并使用具有不同名称空间的两个不同DataContract属性。

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详细说明了整个过程。