【问题标题】:XmlSerializer - There was an error reflecting type. Two classes with the same nameXmlSerializer - 存在反映类型的错误。两个同名的类
【发布时间】:2013-05-09 14:49:01
【问题描述】:

使用 .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")]

但我不允许这样做,因为就我而言,这些类来自自动生成的网络服务代理。

你有解决办法吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 您的解决方案有效,但我想使用 System.Xml.Serialization dll
    【解决方案2】:

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

    【讨论】:

    • 如果我在这些代理类中有枚举类型怎么办?
    • 在为我浪费了足够多的时间之后,我可以用这句话结束,这(几乎)不可能(没有什么是不可能的)。我也尝试了 ISerializable 接口实现。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-06-16
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2017-08-22
      • 1970-01-01
      相关资源
      最近更新 更多