1

次のユースケースがあります。

  • プロセスは、を使用して特定のオブジェクトをファイルにシリアル化しますBufferedOutputStream
  • 各オブジェクトを書き込んだ後、プロセスはを呼び出しますflush()
  • ユースケースは、オブジェクトの書き込み中にプロセスがクラッシュした場合、正常に書き込まれた前のオブジェクトまでファイルを回復したいというものです。

このようなファイルを逆シリアル化するにはどうすればよいですか?そのようなファイルを逆シリアル化する間、Javaはどのように動作しますか。

  • クラッシュする前に正常に書き込まれたオブジェクトまで正常に逆シリアル化されますか?
  • 最後に部分的に書き込まれたオブジェクトを読み取っている間、動作はどうなりますか。どうすればそれを検出できますか?

Update1-

  • オブジェクトの書き込み中にプロセスを手動で強制終了することで、プロセスのクラッシュをシミュレートしようとしました。私は約10〜15回試しましたが、毎回ファイルを逆シリアル化でき、ファイルに部分的なオブジェクトがありません。

私のテストが十分に網羅的であるかどうかはわかりません。したがって、さらにアドバイスが必要です。

Update2- Adamは、ファイルをランダムに切り捨てることを使用して、このようなテストをシミュレートできる方法を指摘していました。以下は、約100回の反復を試したときに観察された動作です-

  • 切り捨てられたファイル(プロセスがクラッシュしたときのファイルの状態と同等である必要があります)から、Javaは最後の完全なオブジェクトまで正常に読み取ることができます。
  • 最後に部分的に書き込まれたオブジェクトに到達すると、JavaはStreamCorruptedExceptionまたはをスローしませんIOException。単にEOFException指示されたものをスローEOFし、部分的なオブジェクトを無視します。
4

4 に答える 4

2

各オブジェクトは、次のオブジェクトを読み取る前に逆シリアル化されるかどうかに関係なく行われます。後のオブジェクトの書き込みに失敗するか、逆シリアル化に失敗するため、影響を受けません。

于 2012-09-21T09:31:36.767 に答える
1

Javaシリアル化を誤用しているのではないかと思います。これは、永続的なストレージの信頼性が高く回復可能な手段を意図したものではありません。そのためにデータベースを使用してください。必要に応じて、データベースを使用してJavaオブジェクトのシリアル化された形式を格納できますが、それはかなり非効率的です。

于 2012-09-21T09:32:09.007 に答える
0

ええ、そのようなシナリオを手動で(プロセスを強制終了して)テストするのは難しいかもしれません。テストケースを作成することをお勧めします。

  1. オブジェクトのセットをシリアル化し、ファイルに書き込みます。
  2. ファイルを開き、基本的にランダムな位置で切り捨てます。
  3. ロードして逆シリアル化してみてください(そして何が起こるかを見てください)
  4. 他のいくつかの切り捨て位置で1から3を繰り返します。

このようにして、壊れたファイルをロードしていること、およびコードがそれを適切に処理していることを確認できます。

于 2012-09-21T09:35:36.113 に答える
-1

ObjectOutputStreamに追加してみましたか?ここで解決策を見つけることができます。appendを使用してObjectOutputStreamを作成する方法を説明する投稿を見つけるだけです。

于 2012-09-21T09:42:03.947 に答える