2

使用下面的代码会XmlSerializer抛出一个期望,因为Foo它包含两个与 enum 同名的属性EnumSameName

框架 .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一切都按预期工作。

这个错误来自哪里?

4

1 回答 1

1

有问题的错误消息应为

类型“Bar2.EnumSameName”和“Bar1.EnumSameName”都使用命名空间“”中的 XML 类型名称“EnumSameName”。使用 XML 属性为类型指定唯一的 XML 名称和/或命名空间。

看一下

XML 命名空间冲突、XmlNodeList 和反序列化等

您可以尝试将代码更改为

[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 文档

控制作为 XML 根元素的属性目标的 XML 序列化。

于 2013-06-19T05:50:50.720 回答