XmlSerializer在枚举上抛出异常

时间:2013-06-19 05:44:37

标签: c# .net xml-serialization

使用以下代码,XmlSerializer会引发预期,因为Foo包含两个与枚举EnumSameName同名的属性。

Framework .NET 4.0

public class Bar1
{
    public enum EnumSameName
    {
        a
    }

    public EnumSameName MyBar1Enum { get; set; }
}

public class Bar2
{
    public enum EnumSameName
    {
        b
    }

    public EnumSameName MyBar2Enum { get; set; }
}

public class Foo
{
    public Foo()
    {
        MyEnum1 = new Bar1();
        MyEnum2 = new Bar2();
    }

    public Bar1 MyEnum1 { get; set; }

    public Bar2 MyEnum2 { get; set; }
}

现在尝试序列化Foo

var parameter = new Foo();
var serializer = new XmlSerializer(parameter.GetType()); 
// ERROR System.InvalidOperationException: [...]

重命名其中一个EnumSameName之后,所有内容都按预期工作。

此错误来自哪里?

1 个答案:

答案 0 :(得分:1)

有问题的错误信息应为

  

类型'Bar2.EnumSameName'和'Bar1.EnumSameName'都使用XML   类型名称,'EnumSameName',来自命名空间''。使用XML属性   为类型指定唯一的XML名称和/或命名空间。

看看

XML Namespace Collisions, XmlNodeList and Deserialization, and More

您可以尝试将代码更改为

[XmlRoot("Bar1", Namespace = "http://example.com/schemas/Bar1")]
public class Bar1
{
    [XmlRoot("Bar1EnumSameName", Namespace = "http://example.com/schemas/Bar1")]
    public enum EnumSameName
    {
        a
    }

    public EnumSameName Mode { get; set; }
}

[XmlRoot("Bar2", Namespace = "http://example.com/schemas/Bar2")]
public class Bar2
{
    [XmlRoot("Bar2EnumSameName", Namespace = "http://example.com/schemas/Bar2")]
    public enum EnumSameName
    {
        b
    }

    public EnumSameName Mode { get; set; }
}

经过深思熟虑后,只需添加XmlRoot documentation

即可
  

将属性目标的XML序列化控制为XML根   元件。