【问题标题】:Polymorphic XML serialization/deserialization多态 XML 序列化/反序列化
【发布时间】:2011-05-03 13:36:07
【问题描述】:

我有:

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?

谢谢, 安德烈

【问题讨论】:

    标签: .net xml serialization xml-serialization


    【解决方案1】:

    用 XmlSerializer 试试XmlArrayItem

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

    【讨论】:

    • 这也有效!谢谢!现在我不知道接受哪种解决方案:)
    • @Abdrey JaredPar 真的有足够的代表 ;-)
    • 谢谢,我今天尝试了不同的方法,效果最好!
    【解决方案2】:

    听起来您在序列化对象的集合部分时遇到了问题。当在 XML 中序列化一个可以包含派生类型的集合时,您需要通知序列化程序所有可能出现在具有XmlInclude 属性的集合中的派生类型

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

    【讨论】:

    • 太棒了,它有效!非常感谢!甚至不需要KnownType&lt;Col&gt; 被扯掉了,但这没关系。
    • KnownType 用于 DataContractoSerializer,XmlInclude 用于 XmlSerializer
    • 感谢您的解决方案。我会接受 Dmitry,因为他的解决方案也有效,而且他的名声要低得多 :) 我希望你没有生气
    • 我不相信这个解决方案有效。 XmlIncludeAttribute 的 AttributeTargets 是 Class、Struct、Method 和 Interface,但不是 Property。将 XmlInclude 应用于类中的属性会导致编译器错误。
    猜你喜欢
    • 2016-07-25
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2017-02-02
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多