• 締切済み

インナークラスを含むオブジェクトのXMLEncoding

インナークラスを含むオブジェクトをXMLエンコーダで直列化しようとすると、 デフォルトコンストラクタが無いといった内容の例外が発生して失敗します。 そのインナークラスをトップレベルにリファクタリングすると、それは全く問題なく 動作することを確認しています。 インナークラスを含めたままXMLエンコーダで直列化するには、特別な方法が 必要なのでしょうか?仕様上不可能? これらに関する情報が全く見つからなくて困っています。 ご存知の方がおられましたら、よろしくお願いします。 import java.beans.XMLEncoder; import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; public class EncodingSample { public class InnerClass { public int getIntValue() { return intValue; } public void setIntValue(int intValue) { this.intValue = intValue; } public String getStringValue() { return stringValue; } public void setStringValue(String stringValue) { this.stringValue = stringValue; } public InnerClass() { } public InnerClass( int intValue, String stringValue ) { setIntValue( intValue ); setStringValue( stringValue ); } private int intValue; private String stringValue; } public void setData( int intValue, String stringValue ) { innerClass = new InnerClass( intValue, stringValue ); } public void encode( String file ) throws FileNotFoundException { XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(file))); encoder.writeObject(this); encoder.close(); } public InnerClass getInnerClass() { return innerClass; } public void setInnerClass(InnerClass innerClass) { this.innerClass = innerClass; } public static void main(String[] args) { EncodingSample sample = new EncodingSample(); sample.setData( 12, "TextString" ); try { sample.encode("SampleFile.xml"); } catch (FileNotFoundException e) { e.printStackTrace(); } } public EncodingSample() { } private InnerClass innerClass; }

みんなの回答

  • newta777
  • ベストアンサー率58% (20/34)
回答No.1

インナークラスは 内部的には親クラスを引数に持つコンストラクタが定義されて 親クラスの値を使えるようになってます。 つまり、インナークラスの場合、 引数なしのデフォルトコンストラクタは作れません。 もしかしたら裏技があるのかもしれませんが、 XMLEncodingするならば、 インナークラスは素直に通常のクラス定義にしたほうが良いのではないでしょうか。

ggable
質問者

お礼

回答ありがとうございます。 >XMLEncodingするならば、 >インナークラスは素直に通常のクラス定義にしたほうが良いのではないでしょうか。 素直にと言われても、設計上インナークラスを使うほうが素直な場合も多いです。 例えば、構造体をサポートしていないJavaでは、その代替としてクラスを使いますが、 icoファイルのデコーダ/エンコーダの構造体(クラス)を全て、 トップレベルに書いてしまうと、他からは全く利用価値のないパブリックなクラスが 多量に存在することになってしまいます。そして、構造体同士のネスト関係が 理解できなくなります。 とりあえず、トップレベルに存在するに相当しないクラスについては、スタティックな インナークラスとして書けば、とりあえずXMLEncoding/Decodingは可能なのですが、 設計(論理)上、スタティックにすべきでないクラスに関しては、対処に苦慮します。 何か対処法をご存知の方がおられましたら、よろしくお願いします。

関連するQ&A