gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:34:48 26 4
gpt4 key购买 nike

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

Serializable的描述中我在类里面读到:

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
  • 对于原子,我的意思是,例如,在将对象写入磁盘时发生断电后,在读取对象时会发生什么;
  • 我没有使用多线程从流中读取或写入对象。

最佳答案

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,那么你所拥有的只是一个短文件,在读取时会导致异常。

关于java - Java(反)序列化是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35548764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com