Я использую XmlSerializer для десериализации XML-ответов от удаленного API.Существует ряд стандартных предопределенных классов, и я создал классы для них.Ключевая часть ответа выглядит следующим образом:
<data>
<employee>
<name>John Doe</name>
<id>E1</id>
....
</employee>
<employee>
....
</employee>
....
</data>
или
<data>
<customer>
<name>Yoyodyne Systems</name>
<id>C1</id>
....
</customer>
<customer>
....
</customer>
....
</data>
Итак, у меня есть классы Customer и Employee, а класс Data имеет свойства, определенные следующим образом:
[XmlElement("customer", typeof(Customer))]
public List<Customer> Customers { get; set; }
[XmlElement("employee", typeof(Employee))]
public List<Employee> Employees { get; set; }
Элемент данных содержит только один тип тега на результат, и я обычно знаю, какой из них должен быть возвращен из данного запроса, поэтому я просто получаю доступ к этому свойству и игнорирую другие, которые оставлены пустыми.
Но я хочу сделать это более расширяемым;в частности, могут быть разные экземпляры удаленного приложения с пользовательскими классами, и я не хочу помещать их все в пакет базового кода.Я надеялся, что смогу добавить свойство в класс Data что-то вроде
public List<object> ExtensionObjects { get; set; }
, а затем использовать конструктор XmlSerializer(Type, Type[])
для предоставления фактических типов, которые я хочу десериализовать.Однако я не знаю, как сказать ему применить это к любым неизвестным тегам или даже указать теги.Например, если у меня есть собственный класс Office, как я могу сделать так, чтобы теги <office>...</office>
были десериализованы в него?Есть ли способ, которым я могу сделать это с XmlSerializer, не возвращаясь к синтаксическому анализу всего как XDocument?
Edit:
Одна вещь, которая кажется многообещающейпытается обработать событие OnUnknownElement;Я могу создать для него делегат, а затем передать его через объект XmlDeserializationEvents в вызов метода Deserialize.Теперь мне нужно найти лучший способ превратить эти неизвестные элементы в экземпляры моих классов расширения.