.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
。 我对如何解决此问题不感兴趣。没什么。我的问题是:这是错误,还是我误会了什么?     
已邀请:
好吧,在第一种情况下,编写的XML看起来像这样:
<Barn>
  <Horse>
    <Rider xsi:nil=\"true\" xmlns=\"abc\" />
  </Horse>
</Barn>
但是,在第二种情况下,XML如下所示:
<Barn>
  <Horse />
</Barn>
因此,在第二种情况下,反序列化本质上是这样的:
Barn barn = new Barn();
barn.Hose = new Horse();
因此,由于我们默认在构造函数中设置了Rider,因此将其保留为\“ Jim Craig \”。 有趣的是,可以通过更改ѭ8the中元素的顺序来反转行为。要尝试发现更多内容,我们可以使用ILSpy和Sgen.exe进行一些挖掘-只需对我们的程序集运行
sgen
并查看生成的程序集即可。 我们发现,在第一种情况下,在
Write2_Horse
Write3_Motorcycle
方法中生成的代码都有一行如下所示:
base.WriteNullableStringLiteral(\"Rider\", \"abc\", o.Rider);
但是在第二种情况下,它看起来像这样:
base.WriteElementString(\"Rider\", \"abc\", o.Rider);
我看不出有任何理由可以更改这种元素的顺序,从而以这种方式更改
Horse
Motorcycle
元素的序列化行为,因此总之我觉得这就像XML序列化程序集中的一个错误发电机。 您可能应该向Microsoft报告:-)     

要回复问题请先登录注册