none
異なる型でXMLシリアライズしたい。 RRS feed

  • 質問

  • Win7 Pro
    Visual Studio 2015 Pro
    C#

    ○ソリューション環境
     ・複数のプロジェクトファイルが存在するソリューションです。
     ・共通クラスは共通プロジェクトに存在します。
     ・継承クラス、及び処理クラス1は、ファイル変換プロジェクトにのみ、存在します。


     ●共通クラス(以下の各publicはそれぞれ同じファイルに宣言しているわけではない)
        public partial class Hoge : Hoge_Common.Data.Base_Hoge
        {
        ※実際には200個くらい
        public sring aaa { get; set; } = "";
        public sring bbb { get; set; } = "";
        }

        public List<Hoge> HogeList { get; set; } = new List<Hoge>();

        // xmlシリアライズ処理
      private static void xmlSerialize(StreamWriter sw, List<Hoge> HogeLists)
      {
       xmlSerializer = new XmlSerializer(typeof(List<Hoge>));
       xmlSerializer.Serialize(sw, HogeLists);
      }


     ●継承クラス

        // Hogeクラスを使用してXML出力したかのようにするため、親タグも書き換える
        [XmlRoot(ElementName = "ArrayOfHoge")]
        public class Locals
        {
            [XmlElement(ElementName = "Hoge")]
            public List<Local> ListLocal { get; set; }
        }

        public partial class Local : Hoge
        {
            ※実際には15個くらい
            [System.Xml.Serialization.XmlIgnoreAttribute]
       public sring ccc { get; set; } = "";
            [System.Xml.Serialization.XmlIgnoreAttribute]
       public sring ddd { get; set; } = "";
        }

      ●処理クラス1

      List<Hoge> HogeLists = new List<Hoge>;
      // 処理データを格納
      List<Local> XMLaryLocal = new List<Local>();   

      HogeLists.AddRange(XMLaryLocal);

    ○やりたいこと
     Hogeクラスという共通クラスがありますが、データを処理する上で、
     継承クラスを使用する必要があります。

     継承クラスで宣言したプロパティはXMLに出力する必要はありません。
     
     共通クラスの「xmlSerializer.Serialize(sw, HogeLists);」において、
     "XML ドキュメントを生成中にエラーが発生しました。"というエラーが発生します。

     これは、継承クラスからなるデータを格納したが、
     XMLシリアライズ時には、継承元クラスの型を使用しているためと考えております。

     そこで、共通クラスの処理内容を変更せず、
     ファイル変換プロジェクト内で格納したデータをXMLシリアライズするには、
     継承クラスを使用せず、Hogeクラスに直接データを格納するしかないでしょうか?


    以上、何卒宜しくお願い申し上げます。
    2019年10月16日 1:38

回答

  • 紆余曲折を経て、継承クラスのプロパティも共通クラスへ追加することで

    対応するようになりました。

    以上です。

    • 回答としてマーク kong0214 2019年10月16日 23:50
    2019年10月16日 23:50

すべての返信

  • シリアライズの処理自体はいじれないとなると、小手先の方法ではどうしようもないでしょうね。

    // DataContractSerializerならなんとかならないこともないけど。デシリアライズ時に型が死にますが。

    2019年10月16日 13:33
  • 紆余曲折を経て、継承クラスのプロパティも共通クラスへ追加することで

    対応するようになりました。

    以上です。

    • 回答としてマーク kong0214 2019年10月16日 23:50
    2019年10月16日 23:50