Надо надеяться, вопрос с очень простым ответом, но это не то, которое я смог найти. У меня есть маленький XML-документ, который примерно походит на это:
<aa>
<bb><name>bb1</name></bb>
<bb><name>bb2</name></bb>
<bb><name>bb3</name></bb>
</aa>
У меня есть классы, которые представляют aa и bb
[XmlRoot("aa")]
public class aa
{
[XmlArray("bbs")]
[XmlArrayItem("bb")]
public bb[] bbs;
}
public class bb
{
[XmlElement("name")]
public string Name;
}
Когда я пытаюсь десериализовать документ с помощью XmlSerializer, я получаю объект aa с пустым указателем bbs свойство. Насколько я понимаю это вызвано тем, что атрибуты, которые я использовал на bbs свойстве, говорят сериализатору ожидать документ как это:
<aa>
<bbs>
<bb><name>bb1</name></bb>
<bb><name>bb2</name></bb>
<bb><name>bb3</name></bb>
</bbs>
</aa>
Учитывая, что я не могу изменить формат XML, я получаю, там способ сказать XmlSerialiser ожидать массив, который не перенесен в другом теге?
Попробуйте заменить свои [XmlArray("bbs")]
и [XmlArrayItem("bb")]
атрибуты на один атрибут [XmlElement]
[XmlRoot("aa")]
public class aa
{
[XmlElement("bb")]
public bb[] bbs;
}
public class bb
{
[XmlElement("name")]
public string Name;
}
, поместив атрибуты Array
и ArrayItem
внутрь, вы явно описывали, как сериализовать это в виде массива с оберточным контейнером.
Измените свой [XmlArray]
/[XmlArrayItem]
на [XmlElement]
, что говорит сериализатору о том, что элементы не имеют обёртки, е. g.
[XmlRoot("aa")]
public class aa
{
[XmlElement("bb")]
public bb[] bbs;
}
public class bb
{
[XmlElement("name")]
public string Name;
}