1

XMLで通信する2つの(異なる)C#システムがあります。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を生成する唯一のオプションはありますか?

4

2 に答える 2

1

この質問によると、インターフェイス プロパティの問題を解決するにはいくつかの方法があります。

  • インターフェイス プロパティを非表示にして、別のプロパティで処理する
  • IXmlSerializable を実装する
  • ラッピング タイプを使用するようにプロパティを変更します
  • DataContractSerializer でリフレクションを使用して、インターフェイス プロパティの現在の値の型を既知の型に追加する
于 2012-08-30T11:37:37.737 に答える
0
public class Parent
{
    [XmlElement(Type = typeof(Girl))]
    [XmlElement(Type = typeof(Boy))]
    public IChild Child { get; set; }
}
于 2012-08-28T14:01:55.133 に答える