有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

^{}类的描述中,我读到:

This may also occur if the serialization stream has been tampered; hence, readObjectNoData is useful for initializing deserialized objects properly despite a "hostile" or incomplete source stream.

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

如果一个部分对象被写入持久内存,然后被检索,我确定会引发异常吗

如果Java序列化是非原子的,那么有没有将对象作为原子操作(反)序列化到持久内存的最佳实践


注:

  • 在这里,我不考虑对数据库进行序列化(例如使用Hibernate);对于持久性存储,我指的是例如使用ObjectInputStreamFileInputStream
  • 对于atomic,我的意思是,例如,在对象写入磁盘时发生断电后,在读取对象时会发生什么
  • 我没有使用多线程从流中读取或写入对象

共 (1) 个答案

  1. # 1 楼答案

    This could hint to the fact that reading objects from an ObjectInputStream is not atomic. Does that mean that reading Java objects from a stream may not be an atomic operation?

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

    Am I certain that an exception is thrown if a partial object was written to persistent memory and then retrieved?

    我不明白你怎么能避免出现异常

    If Java serialization is non-atomic, are there any best practices of serializing objects to persistent memory as an atomic operation?

    您不能确保它发生,但是如果它没有发生,您可以捕获抛出的异常。调用flush(),如果失败,您将有一个不完整的序列化

    with atomic I mean for instance what happens during power loss when writing to disk

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