Java(de)序列化是原子的吗?

时间:2016-02-22 08:17:19

标签: java serialization persistence atomic objectinputstream

对于这个问题,假设当对象被完全写入流并成功读出时,或者当对象被部分写入流并且在回读对象时发生异常时,序列化/反序列化是原子的。假设写操作可能无法成功完成,例如,因为停电。

Serializable课程的描述中,我读到了:

  

如果序列化流已被篡改,也可能发生这种情况;因此,readObjectNoData对于正确初始化反序列化的对象非常有用,尽管它们具有“敌对”功能。或不完整的源流。

这个可以暗示从ObjectInputStream读取对象不是原子的。这是否意味着从流中读取Java对象可能不是原子操作?

如果将部分对象写入持久性内存然后检索,我是否确定会抛出异常?

如果Java序列化是非原子的,是否有任何最佳实践(反)将对象序列化为持久性内存作为原子操作?

注意:

  • 我没有考虑在这里对数据库进行序列化(例如使用Hibernate);持久存储我的意思是使用ObjectInputStreamFileInputStream;
  • with atomic我的意思是例如在写入对象时读取对象时发生的事情,当它们被写入磁盘时发生;
  • 我没有使用多线程来读取或写入流中的对象。

1 个答案:

答案 0 :(得分:1)

  

这可能暗示从ObjectInputStream读取对象不是原子的。这是否意味着从流中读取Java对象可能不是原子操作?

我不知道在任何意义上它 原子的任何声明,但我也不知道它与你引用的摘录有什么关系。读取一个对象涉及很多读取操作:标记,类名和所有字段,因此整体操作在你看来意义上是不可能的。

  

如果将部分对象写入持久性内存然后检索,我是否确定会抛出异常?

我看不出你怎么能避免异常。

  

如果Java序列化是非原子的,那么是否存在将对象序列化为持久性内存作为原子操作的最佳实践?

您无法确保它发生,但如果不这样做,您可以捕获引发的异常。调用flush(),如果失败,则序列化不完整。

  

with atomic我的意思是例如写入磁盘时断电时会发生什么

将对象写入磁盘也不是原子的。它们由几个逻辑写入组成。如果您的程序由于断电而停止,因此甚至没有得到IOException,那么您所拥有的只是一个短文件,在读取时会导致异常。