XmlSerializer - 反映类型时出错。两个具有相同名称的类

时间:2013-05-09 14:49:01

标签: c# .net .net-4.0 xml-serialization

使用.Net 4中的XmlSerializer,我试图序列化一个包含两个具有相同名称但名称不同的类的类。

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

事实证明,序列化程序无法区分我使用相同名称的这两个类。例外情况显示:

  

'Types MyNamespace1.MyClass'和'MyNamespace2.MyClass'都使用来自命名空间''的XML类型名称'MyClass'。使用XML属性为类型指定唯一的XML名称和/或命名空间。

我找到了一个解决方案in this thread,包括用这样的属性装饰同名类:

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

但我不允许这样做,因为在我的情况下,这些类来自自动生成的代理到Web服务。

你有解决方案吗?

3 个答案:

答案 0 :(得分:2)

您可以尝试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>

答案 1 :(得分:1)

我认为您可以为每个代理类创建一个分部类,并在每个代理类中添加XmlType标头。

答案 2 :(得分:0)

在我失去足够的时间之后,我可以用这句话结束(这几乎是不可能的)(没有什么是不可能的)。我也试过了ISerializable接口实现。