1

次のコードを実行して JSON を保存すると:

String regionObject = this.gson.toJson(parentRegion);
JsonFileInputOutput.saveObjectToTextFile(regionObject,
    "./tests/model/util/test_saveRegionObject.txt");  

その後、作成した .txt ファイルを再度開きます。

public void test_openRegionObject() throws IOException {
String regionAsString = JsonFileInputOutput
    .openObjectInTextFile("./tests/model/util/test_saveRegionObject.txt");
Gson gson = new Gson();
Region LGNRegion = gson.fromJson(regionAsString, Region.class);
System.out.println(LGNRegion.toString());
}

それは完全に正常に動作します。

ただし、コードの 2 番目のスニペットを最初のコードを含まない別のクラスにしようとすると、次のエラーが発生します。

java.lang.RuntimeException Failed to invoke public model.MARK_II.Cell() with no args

Cellクラス内で使用されるカスタム クラスですRegionCellクラスの実装は次のとおりです。

public abstract class Cell {
protected boolean isActive;

public Cell() {
this.isActive = false;
}

public boolean getActiveState() {
return this.isActive;
}

public void setActiveState(boolean isActive) {
this.isActive = isActive;
}

}

私の質問は、コードの最初のスニペットで作成した適切なシリアル化された JSON を読み取ることができるように、この例外を修正するにはどうすればよいかということです。

4

1 に答える 1

0

ここで 2 つの質問があります。

  1. 例外が発生するのはなぜですか? これは簡単に答えることができます。あなたのCellクラス(またはクラスのサブクラスCellCell抽象的であるため)には、パラメーターのないコンストラクターがありません。1 つ以上のパラメーターを持つコンストラクターを持っている可能性があります。

  2. 汎用ファイルを開けないのはなぜですか? ファイルを見せずに言うのは難しいです。Json シリアライゼーションをファイルに保存して開くだけでエラーが発生しないことは確かです。私の最善の推測は次のとおりです。シリアル化して保存すると、Cell内部にサブクラスがありません(メンバー変数がnullである可能性があります)。別のファイルを開くたびに、Cellサブクラスが定義されている可能性があるため、1.の答えが適用されます。

于 2013-09-06T20:44:49.070 に答える