使用以下代码,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
之后,所有内容都按预期工作。
此错误来自哪里?
答案 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根 元件。