Представьте, что у вас есть 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; }
}
База определена как 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
в определении класса, кажется самозакрывающимся, элемент сразу после родительского тега имеет значение null
ed.Как я могу настроить XmlSerializer
для обработки самозакрывающихся тегов как пар открытого-закрытого типа?SuperImportant
следует десериализовать в обоих случаях, но не в первом, что неправильно.