2013-06-19 55 views
2

使用以下代码,XmlSerializer抛出一个异常,因为Foo包含两个属性,它们与枚举EnumSameName的名称相同。XmlSerializer在枚举上抛出异常

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

有问题的错误消息应该是

类型 '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

控制attribu的XML序列化te目标作为XML根 元素。

相关问题