【发布时间】:2018-06-08 08:39:48
【问题描述】:
想象一下具有如下 XML 结构:
[XmlRoot("Foo")]
public class Foo
{
[XmlElement("Bar")]
public Bar Bar { get; set; }
[XmlElement("SuperImportant")]
public SuperImportant SuperImportant { get; set; }
}
[XmlRoot("Bar")]
public class Bar
{
[XmlElement("Baz")]
public XmlElement Baz { get; set; }
}
[XmlRoot("SuperImportant")]
public class SuperImportant
{
[XmlElement("MegaImportant")]
public string MegaImportant { get; set; }
}
由于某种原因,Baz 被定义为XmlElement。
现在检查此代码:
var template = @"
<Foo>
<Bar>
{0}
</Bar>
<SuperImportant>
<MegaImportant>42</MegaImportant>
</SuperImportant>
</Foo>";
var selfClosed = new StringReader(String.Format(template, "<Baz/>"));
var openClosePair = new StringReader(String.Format(template, "<Baz></Baz>"));
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Foo));
var o1 = (Foo)xmlSerializer.Deserialize(selfClosed);
Console.WriteLine(o1.SuperImportant == null); // True, it's not there
var o2 = (Foo)xmlSerializer.Deserialize(openClosePair);
Console.WriteLine(o2.SuperImportant == null); // False, it's there
如您所见,如果在类定义中定义为XmlElement 的某个标记似乎是自封闭的,则其父标记之后的元素是nulled。如何配置XmlSerializer 将自闭标签视为开闭对? SuperImportant在这两种情况下都应该反序列化,但不是前者,这是错误的。
【问题讨论】:
-
为什么你认为案例一可以,而案例二不行?我希望无论之前的元素是否以任何形式存在,
SuperImportant都应该被序列化。我无法想象为什么它应该不在自关闭Baz之后反序列化,而在拥有<Baz></Baz>时应该反序列化。还是我错过了什么? -
@HimBromBeere 是的,当然,
SuperImportant这两种情况都应该序列化,但不是,这就是我在这里的原因。
标签: c# xml serialization xmlserializer