1

我有以下用例。

  • 进程将某些对象序列化为使用BufferedOutputStream.
  • 写完每个对象后,进程调用flush()
  • 用例是如果进程在写入对象时崩溃,我想将文件恢复到已成功写入的前一个对象。

我怎样才能反序列化这样的文件?反序列化此类文件时 Java 将如何表现。

  • 它会成功反序列化到崩溃前成功写入的对象吗?
  • 在读取最后一个部分写入的对象时,会发生什么行为。我怎样才能检测到呢?

更新1 -

  • 我试图通过在写入对象时手动终止进程来模拟进程崩溃。我已经尝试了大约 10-15 次。每次我能够反序列化文件并且文件没有任何部分对象。

我不确定我的测试是否足够详尽,因此需要进一步的建议。

Update2 - Adam 指出了一种可以使用随机截断文件来模拟此类测试的方法。以下是尝试大约 100 次迭代时观察到的行为 -

  • 从截断的文件(应该相当于进程崩溃时文件的条件),Java可以成功读取到最后一个完整的对象。
  • 在到达最后一个部分写入的对象时,Java 不会抛出任何StreamCorruptedExceptionIOException. 它只是抛出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?您可以在此处找到解决方案,只需找到解释如何使用附加创建 ObjectOutputStream 的帖子。

于 2012-09-21T09:42:03.947 回答