У меня устаревшая система, которая использует некоторые данные, хранящиеся в формате XML. Формат XML не может быть изменен без возникновения критических проблем (например, инструментов и другого программного обеспечения, которое считывает формат).
XML имеет следующую структуру:
<Things>
<ThingOne Name="FirstThing">
<ThingOne Name="FirstChildThing" />
<ThingTwo Name="SecondChildThing"/>
</ThingOne>
<ThingTwo Name="SecondThing">
<ThingOne Name="ThirdChildThing" />
<ThingTwo Name="FourthChildThing" />
</ThingTwo>
</Things>
В моем сценарии «ThingOne» и «ThingTwo» - это классы, расширяющие «SomeThing». Примерно так:
public abstract class SomeThing
{
public int ItemNumber {get; set;}
public string Name {get; set;}
public List<SomeThing> ChildThings {get; set;}
public abstract void InspectChildren();
}
public sealed class ThingOne : SomeThing
{
public override void InspectChildren()
{
/*Iterates Child Things and performs actions*/
}
}
public sealed class ThingTwo : SomeThing
{
public override void InspectChildren()
{
/*Iterates Child Things and performs actions different from thing one*/
}
}
А «Вещи» - это класс с набором «SomeThing»:
public sealed class Things
{
/*Thing One and Thing Two should be deserialized to here*/
public List<SomeThing> ThingItems {get; set;}
}
Вот такой инспектор вещей:
public static ThingInspector
{
public static void InspectThings(IEnumerable<SomeThing> thingsToInspect)
{
foreach(var thing in thingsToInspect)
{
thing.InspectChildren()
}
}
}
Однако, когда я использую XmlSerializer для десериализации XML в экземпляр «Вещей», он не берет «ThingOne» и «ThingTwo» и не добавляет их в ThingItems.
Я пытался украсить классы следующие:
public sealed class Things:IList<SomeThing>
{
/*Thing One and Thing Two should be deserialized to here*/
[XmlArrayItem(typeof(ThingOne), ElementName = "ThingOne")]
[XmlArrayItem(typeof(ThingTwo), ElementName = "ThingTwo")]
public List<SomeThing> ThingItems {get; set;}
/*Example doesn't include IList implementation, but it is present and correct*/
}
public abstract class SomeThing
{
[XmlIgnore]
public int ItemNumber {get; set;}
[XmlAttribute]
public string Name {get; set;}
[XmlArrayItem(typeof(ThingOne), ElementName = "ThingOne")]
[XmlArrayItem(typeof(ThingTwo), ElementName = "ThingTwo")]
public List<SomeThing> ChildThings {get; set;}
public abstract void InspectChildren();
}
Десериализованный объект является экземпляром «Вещей», но ThingItems пуст.
Что мне не хватает? Я попытался изменить формат xml, чтобы «ThingOne» и «ThingTwo» были заключены в список «ThingItems», и это нормально работает, но формат xml в производственной системе нельзя изменить без сбоев в работе другого программного обеспечения. это чтение и запись xml данных.
Моя проблема в том, что мне нужно десериализовать дочерние элементы «Вещей» в список в соответствующем классе «Вещи» вместо того, чтобы навязывать структуру объекта элементу XML. Будем признательны за любые рекомендации.