多态XML序列化/反序列化

4

我有:

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>
XmlSerializerDataContractSerializer均无法帮助我。此XML结构为强制性要求。
所以问题是:是否可以实现这一点,还是我必须手动解析该XML?
谢谢, Andrey
2个回答

10
尝试使用XmlSerializer中的XmlArrayItem:

点击此处了解更多。

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

这个也可以!谢谢!现在我不知道要选哪个解决方案了 :) - Andrey
@Abdrey JaredPar 的声望已经足够高了 ;-) - user166390
谢谢,我今天尝试了不同的方法,这个效果最好! - iagomartinez

4

看起来你在序列化对象的集合部分遇到了问题。在XML中序列化一个可能包含派生类型的集合时,需要使用XmlInclude属性告知序列化器所有可能出现在集合中的派生类型。

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

太棒了,它能正常工作!非常感谢!即使不需要“KnownType”也可以。<Col>被删除了,但这没关系。 - Andrey
KnownType被DataContractSerializer使用,XmlInclude用于XmlSerializer。 - Dmitry Ornatsky
谢谢你的解决方案。我会接受Dmitry的方案,因为他的方案也有效,并且他的声望要低得多 :) 希望你没有生气。 - Andrey
2
我不相信这个解决方案可行。XmlIncludeAttributeAttributeTargets 是类、结构体、方法和接口,但不包括属性。在类的属性上应用 XmlInclude 会导致编译器错误。 - Slauma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接