Страницы

Поиск по вопросам

суббота, 16 марта 2019 г.

Deserialize вариационных (типизированных) XML

Раньше не сталкивался с сериализацией объектов, особенно с сериализацией в XML и обратно, но пришлось - да не знаю как быть с объектами в которых присутствует поле класса Object, в котором могут быть объекты нескольких типов. Пример XML 123 1001 232 1001 943 TheName Пример XML Error Message Предполагаю, что классы можно записать так (хотя в записи не уверен, ибо не работает): [XmlRootAttribute("Entities", Namespace = "http://site.org/", IsNullable = false)] public class BoxPackages { [XmlArray(IsNullable = true)] public BoxError Error; [XmlArray(IsNullable = true)] public object[] Package; }
public class BoxError { public String Message; }
[XmlRootAttribute("TypeA")] public class PackageTypeA { public Int32 ID; public Int64 Number; }
[XmlRootAttribute("TypeB")] public class PackageTypeB { public Int32 ID; public Byte Type; }
[XmlRootAttribute("TypeC")] public class PackageTypeC { public Int32 ID; public String Name; } Понятно, что классов не достаточно - нужна ещё какая-то настройка сериализатора. Кто знает, как настроить сериализатор (XmlAttributes из коробки) для десериализации XML в объект типа BoxPackages? Подскажите, пожалуйста?


Ответ

Класс XmlSerializer умеет сериализовать только известные типы. Т.к. в массве object[] может быть любой объект любого типа, в конструкторе этого класса надо перечислить все возможные типы объектов, которые предполагается использовать: Type [] extraTypes = new Type[3]; extraTypes[0] = typeof(PackageTypeA); extraTypes[1] = typeof(PackageTypeB); extraTypes[2] = typeof(PackageTypeC);
// Create the XmlSerializer instance. XmlSerializer mySerializer = new XmlSerializer(typeof(BoxPackages),extraTypes); Этот пример основан на XmlSerializer - конструктор

Комментариев нет:

Отправить комментарий