Страницы

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

пятница, 24 января 2020 г.

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

#c_sharp #xml #serializable #unserialize


Раньше не сталкивался с сериализацией объектов, особенно с сериализацией в 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? Подскажите, пожалуйста?    


Ответы

Ответ 1



Класс 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 - конструктор.

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

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