基本的に、オブジェクトを XML ファイルにシリアル化するメソッドと、XML からオブジェクトを読み取るメソッドの 2 つのメソッドを持つクラスがあります。オブジェクトを復元するメソッドの同期部分の例を次に示します。
public T restore(String from) throws Exception {
// variables declaration
synchronized (from) {
try {
decoder = new XMLDecoder(new BufferedInputStream(
new FileInputStream(from)));
restoredItem = decoder.readObject();
decoder.close();
} catch (Exception e) {
logger.warning("file not found or smth: " + from);
throw new Exception(e);
}
}
// try to cast it
}
オブジェクトをシリアライズするときも、同様のアプローチが取られます。ここで、単体テストを作成すると、各スレッドがブール値または文字列をシリアル化して即座に読み取ろうとする 10 個のスレッドが作成され、ClassCastExceptions が発生したことを示して失敗します。これは、シリアル化が間違っていると思います (シングルスレッド環境ではすべて問題ありません)。この時点まで私と一緒にいてくれた場合:)、ここにあなたの助けが必要な2つの問題があります:
- メソッドに渡された文字列引数を同期することは理にかなっていますか (Java に文字列プールがあることを考慮して)? ところで、XMLSerializer クラス自体で同期を試みましたが、結果は同じままでした。
- 単一のファイルで io 操作を正しく同期するにはどうすればよいですか?