Java: 断言文件序列化完成?

Java: Assert that file serialization is complete?

我正在处理 Java 中的一个对象,该对象的计算成本非常高,大小达数兆字节。为了在应用程序重新启动时保留它,我想将它序列化为 File,并在启动时重新加载该文件(如果存在)。

问题是大多数文件系统都不是事务性的。文件写入过程可以被异常中断,JVM 终止and/or 电源故障。我绝对需要断言的是,如果使用该文件,其中的信息是完整。如果需要,我可以丢弃这些信息并重新计算,但必须避免阅读和依赖不完整的数据。

我的尝试是序列化并在文件末尾写入一个 "seal" 对象,例如校验和。反序列化期间此对象的存在保证序列化过程已完成。如果在反序列化过程中没有 seal 对象,我知道我不能相信文件中的数据,因为它可能不完整。我正在寻找一个OS独立的解决方案,我不需要考虑"attacks"恶意修改序列化文件内容

我的问题是: 上面概述的密封对象方法是否 安全 ,或者是否还有一些我可以结束的极端情况在没有注意到的情况下读取了一个不完整的文件?

只需使用不同的临时名称写入文件即可。文件完成后,删除文件的任何先前版本并将新文件重命名为真实名称。

如果程序在写入过程中死机,您只会留下一个不完整的临时文件。真实文件仍然和以前一样(或丢失),因此您永远不会看到要加载的不完整文件。