Полиморфная XML-сериализация / десериализация - PullRequest
3 голосов
/ 01 ноября 2010

У меня есть:

public class B     
{
    public string Some { get; set; }
}

public class D : B
{
    public string More { get; set; }
}

[KnownType(typeof(D))]
public class X
{        
    public B[] Col { get; set; }
}

Я хочу автоматически читать / писать XML точно так же, как:

<X>
 <Col>
  <B Some="val1" />
  <D Some="val2" More="val3" />
 </Col>
</X>

Ни XmlSerializer, ни DataContractSerializer не помогли мне.Эта структура XML является обязательной.

Итак, вопрос в том, можно ли этого достичь, или мне придется анализировать этот XML вручную?

Спасибо, Андрей

Ответы [ 2 ]

8 голосов
/ 01 ноября 2010

Попробуйте XmlArrayItem с XmlSerializer:

public class X
{        
     [XmlArrayItem(typeof(D)),
      XmlArrayItem(typeof(B))]
     public B[] Col { get; set; }
}
4 голосов
/ 01 ноября 2010

Похоже, у вас проблемы с сериализацией коллекционной части объекта. При сериализации коллекции в XML, которая может содержать производные типы, необходимо сообщить сериализатору обо всех производных типах, которые могут появиться в коллекции, с атрибутом XmlInclude

[KnownType(typeof(D))] 
public class X 
{ 
  [XmlInclude(Type=typeof(B))]
  [XmlInclude(Type=typeof(D))]        
  public B[] Col { get; set; } 
} 
...