将Poco序列化为XML并反序列化回Poco(在其他不相关的系统上)

时间:2012-08-28 13:24:36

标签: c# xml xml-serialization

我有两个(不同的)C#系统,它们通过XML进行通信。我们已就XML格式达成一致。

我要做的下一件事就是序列化一个类:

  public class Parent
  {
    public IChild Child { get; set; }
    public string Name { get; set; }
  }
  public interface IChild
  {
    string Name { get; set; }
  }
  public class Girl:IChild
  {
    public string Name { get; set; }
    public string FavDoll { get; set; }
  }
  public class Boy : IChild
  {
    public string Name { get; set; }
    public string FavCar { get; set; }
  }

使用IXmlSerializer时的结果:

<击> 使用IXmlSerializable时,我得到一个异常,接口IChild(wellwaddayaknow)上没有构造函数。

  

好的,修好了(感谢@Giedrius)

     

由于@RobertH

而减少了ns

ref

<Parent>
  <Child>
    <Boy>
      <Name>Bill</Name>
      <FavCar>Chevvy</FavCar>
    </Boy>
  </Child>
</Parent>

使用DataContract时,我得到一个xmlns有一个对命名空间的引用。其他系统中没有。因此,当反序列化时,我得到一个异常,引用就不存在了。

<Parent xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Child xmlns:d2p1="TestConsole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" i:type="d2p1:TestConsole.Boy">
    <FavCar xmlns="http://schemas.datacontract.org/2004/07/TestConsole">Chevvy</FavCar>
    <Name xmlns="http://schemas.datacontract.org/2004/07/TestConsole">Bill</Name>
  </Child>
</Parent>

我唯一的选择是使用XDocument并生成很多loc?

2 个答案:

答案 0 :(得分:1)

根据this question,有几种方法可以解决界面属性问题:

  • 隐藏界面属性并在另一个属性中处理
  • 实施IXmlSerializable
  • 修改您的媒体资源以使用环绕类型
  • 使用DataContractSerializer的反射将接口属性当前值类型添加到已知类型

答案 1 :(得分:0)

public class Parent
{
    [XmlElement(Type = typeof(Girl))]
    [XmlElement(Type = typeof(Boy))]
    public IChild Child { get; set; }
}