2

我有两个DataContracts,我使用DataContractSerializer.

我为两个不同的 s 指定了不同的命名空间,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的 s 的建议,因为不幸的是我正在重构遗留代码并且 XML 格式无法更改。

4

1 回答 1

2

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。 这篇 MSDN 博客文章详细介绍了整个过程。

于 2013-06-12T17:55:27.677 回答