1

.Net 4 の XmlSerializer を使用して、名前が同じで名前空間が異なる 2 つのクラスを含むクラスをシリアル化しようとしています。

[XmlInclude(typeof(MyNamespace1.MyClass))]
[XmlInclude(typeof(MyNamespace2.MyClass))]
public class SuperInfo
{
    public MyNamespace1.MyClass A{ get; set; }
    public MyNamespace2.MyClass B{ get; set; }
}

シリアライザーは、同じ名前のこれら 2 つのクラスを区別できないことが判明しました。例外は次のとおりです。

'Types MyNamespace1.MyClass' と 'MyNamespace2.MyClass' は両方とも、名前空間 '' の XML 型名 'MyClass' を使用します。XML 属性を使用して、型の一意の XML 名や名前空間を指定します。

このスレッドで解決策を見つけました。同名のクラスを次のような属性で装飾することで構成されています。

[XmlType("BaseNamespace1.MyClass")]
[XmlType("BaseNamespace2.MyClass")]

私の場合、これらのクラスは自動生成されたプロキシから Web サービスに渡されるためです。

解決策はありますか?

4

3 に答える 3

3

Newtonsoft.Jsonを試して、以下のようにオブジェクトを XML に変換できます。

using System.Xml.Serialization;
using Newtonsoft.Json;

namespace SoTestConsole
{
    [XmlInclude(typeof(TestClassLibrary.Class1))]
    [XmlInclude(typeof(TestClassLibrary1.Class1))]
    public class SuperInfo
    {
        public TestClassLibrary.Class1 A { get; set; }
        public TestClassLibrary1.Class1 B { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var obj = new SuperInfo()
            {
                A = new TestClassLibrary.Class1() { MyProperty = "test1" },
                B = new TestClassLibrary1.Class1() { MyProperty = "test2" }
            };

            // Error case
            //XmlSerializer xmlSerializer = new XmlSerializer(typeof(SuperInfo));

            // but below will work 
            var json = JsonConvert.SerializeObject(obj);
            var xDoc = JsonConvert.DeserializeXNode(json, "SuperInfo");

        }
    }
}

出力

<SuperInfo>
  <A>
    <MyProperty>test1</MyProperty>
  </A>
  <B>
    <MyProperty>test2</MyProperty>
  </B>
</SuperInfo>
于 2013-05-09T16:09:24.303 に答える
1

これらのプロキシ クラスごとに部分クラスを作成し、それぞれに XmlType ヘッダーを追加できると思います。

于 2013-05-10T07:36:37.140 に答える