2013-06-19 56 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根 元素。

相關問題