.NET XmlSerializer错误,当两个类具有相同名称的属性时
||
准备好燃烧的火把吧!互联网上有人建议.NET框架中存在错误! :-)
考虑以下人为模型:
public class Barn
{
public Horse Horse { get; set; }
public Motorcycle Motorcycle { get; set; }
}
public class Horse
{
public Horse()
{
Rider = \"Jim Craig\";
}
[XmlElement(IsNullable = true, Namespace = \"abc\")]
public string Rider { get; set; }
}
public class Motorcycle
{
public Motorcycle()
{
Rider = \"Ghost\";
}
[XmlElement(IsNullable = false, Namespace = \"abc\")]
public string Rider { get; set; }
}
请注意,两个“ 1”属性共享相同的名称和名称空间,但在其他方面则不相关。一种是XML可为空,另一种则不是。
这是一些代码,可以对XML进行序列化,然后反序列化一个空骑士:
// Create a Barn, with a Horse, with a null Rider
Barn barnBefore = new Barn();
barnBefore.Horse = new Horse();
barnBefore.Horse.Rider = null;
// Serialize and then deserialize the Barn
XmlSerializer serializer = new XmlSerializer(typeof(Barn));
MemoryStream stream = new MemoryStream();
serializer.Serialize(stream, barnBefore);
stream.Seek(0, SeekOrigin.Begin);
Barn barnAfter = (Barn)serializer.Deserialize(stream);
// Is the Horse\'s Rider still null?
Console.WriteLine(barnAfter.Horse.Rider == null ? \"null\" : \"not null\");
Horse
\的Rider
属性具有IsNullable = true
,因此应通过序列化保持其空值。运行上面的代码,输出确实为空。到目前为止,一切都很好。
现在,这是有趣的部分:交换Barn
类中Horse
和Motorcycle
属性的顺序,以便Motorcycle
排在最前面。
再次运行它,现在输出不为空。我勒个去?!
我已经在VS 2008和2010上进行了测试。
为了获得更多乐趣,请尝试将两个Rider
属性设置为不同的类型,例如,将一个string
属性设置为ѭ12the。那真是糟了XmlSerializer
。
我对如何解决此问题不感兴趣。没什么。我的问题是:这是错误,还是我误会了什么?
没有找到相关结果
已邀请:
1 个回复
骨乏唯瓜
但是,在第二种情况下,XML如下所示:
因此,在第二种情况下,反序列化本质上是这样的:
因此,由于我们默认在构造函数中设置了Rider,因此将其保留为\“ Jim Craig \”。 有趣的是,可以通过更改ѭ8the中元素的顺序来反转行为。要尝试发现更多内容,我们可以使用ILSpy和Sgen.exe进行一些挖掘-只需对我们的程序集运行
并查看生成的程序集即可。 我们发现,在第一种情况下,在
和
方法中生成的代码都有一行如下所示:
但是在第二种情况下,它看起来像这样:
我看不出有任何理由可以更改这种元素的顺序,从而以这种方式更改
和
元素的序列化行为,因此总之我觉得这就像XML序列化程序集中的一个错误发电机。 您可能应该向Microsoft报告:-)