2

DataContractを使用して XML にシリアル化する2 つの がありますDataContractSerializer

2 つの異なる に異なる名前空間を指定していますDataContractDataMember、それぞれ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 形式を変更できないため、 をより適切に整理する方法についての提案を探しているわけではありません。

4

1 に答える 1

2

DataContractSerializerは XML 生成に対するきめ細かな制御を公開しないため、この種の属性は本質的に利用できません。ただし、名前空間が異なるsealed2 つの異なる属性を使用して、共有クラスをサブクラス化できます (アクセス修飾子を取り除くことができると仮定します)。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 に答える