none
シリアル化における循環参照 RRS feed

  • 質問

  • 子要素をArrayListに保持し、子要素は親要素への参照を保持する、ツリーノードのようなコンポジット構造になっているクラスがあります。このクラスのオブジェクトをXMLシリアル化すると、「シリアル化中に循環参照がみつかりました」というエラーがでます。

    確かに考えてみれば子要素の内容をシリアル化しているときに親要素の内容もシリアル化することになるので無限に続いてしまうのは分かります。また、親要素はxml構造から明らかであるのでシリアル化しなくても良いともいえます。

    しかしながら、親要素への参照をXmlIgnore属性で無視してシリアル化すると、逆シリアル化したときに親要素への参照を保持するプロパティがnothingになってしまうため、親要素を参照するメソッドを使おうとするときにNullReferrenceExceptionが出てしまいます。

    このような状況にはどのような対処方法があるでしょうか。

     

    2006年12月16日 17:17

回答

  • シリアライズにはSerializeAttributeを使用する方法と、
    ISerializableインタフェースを実装して、フォーマッター(SoapFormaterとか)でシリアライズする方法があります。

    恐らく今使用されているのは前者だと思いますが、後者であればリモーティングで使用する方法なので
    循環参照も参照値を持つだけという形で解消されたと思います。

     

    2006年12月17日 0:21

すべての返信

  • シリアライズにはSerializeAttributeを使用する方法と、
    ISerializableインタフェースを実装して、フォーマッター(SoapFormaterとか)でシリアライズする方法があります。

    恐らく今使用されているのは前者だと思いますが、後者であればリモーティングで使用する方法なので
    循環参照も参照値を持つだけという形で解消されたと思います。

     

    2006年12月17日 0:21
  • とりあえず自己レス。

    逆シリアル化した後に、ノードの上位のオブジェクトから全ての子要素に自分への参照を親要素としてセットするという操作を階層的に行うと問題は解決します。しかしこのようなことを行わずに親要素への参照そのものをシリアル化・逆シリアル化できる方法がないものでしょうか?

    2006年12月17日 0:31
  • ネットクラゲ様

    ありがとうございました。SoapFormatterを使ってみたら全て上手くいきました。SoapFormatterは初めて使いましたが非常に簡単で便利ですね。Binaryでシリアル化すると内容が判読できないのですがSoapFormatterならばXMLになるので求めていたものにぴったりです。

    .netFramework 2.0ではSoapFormatterは使われなくなったと聞いたことがあるような気がしたのですがちゃんと使えますね。

    2006年12月17日 1:08