Java(反)序列化是原子的吗?
Is Java (de-)serialization atomic?
对于这个问题,假设当对象完全写入流并成功读出时,或者当对象部分写入流并且对象发生异常时,serialization/deserialization是原子的被回读。假设写入操作可能无法成功完成,例如因为停电了。
在 Serializable
class 的描述中,我读到:
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);使用持久存储我的意思是例如使用
ObjectInputStream
和 FileInputStream
;
- 对于原子,我的意思是例如在将对象写入磁盘时发生断电后读取对象期间发生的情况;
- 我没有使用多线程从流中读取或写入对象。
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?
我不知道任何地方的任何声明它 是 原子在你的意思的意义上,但我也不知道它与你的摘录有什么关系引用。读取一个对象涉及很多读取操作:标记、class 名称和所有字段,因此整个操作不可能是您所指的意义上的原子。
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
,你所拥有的只是一个短文件,在读取时会导致异常。
对于这个问题,假设当对象完全写入流并成功读出时,或者当对象部分写入流并且对象发生异常时,serialization/deserialization是原子的被回读。假设写入操作可能无法成功完成,例如因为停电了。
在 Serializable
class 的描述中,我读到:
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);使用持久存储我的意思是例如使用
ObjectInputStream
和FileInputStream
; - 对于原子,我的意思是例如在将对象写入磁盘时发生断电后读取对象期间发生的情况;
- 我没有使用多线程从流中读取或写入对象。
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?
我不知道任何地方的任何声明它 是 原子在你的意思的意义上,但我也不知道它与你的摘录有什么关系引用。读取一个对象涉及很多读取操作:标记、class 名称和所有字段,因此整个操作不可能是您所指的意义上的原子。
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
,你所拥有的只是一个短文件,在读取时会导致异常。