首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java (反)序列化是原子的吗?

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

Stack Overflow用户
提问于 2016-02-22 08:17:19
回答 1查看 338关注 0票数 1

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

在对Serializable类的描述中,我读到:

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

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

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

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

备注:

  • 这里我不考虑将数据库序列化(例如使用Hibernate);对于持久存储,我的意思是使用ObjectInputStreamFileInputStream
  • 以原子为例,我的意思是,在读取物体时,当它们被写入做磁盘时,在发生功率损失之后会发生什么;
  • 我不使用多线程从流中读取或写入对象。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-22 23:49:10

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

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

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

我看不出你怎么能避免得到例外。

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

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

例如,对于原子,我的意思是写到磁盘时在断电期间会发生什么。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35548764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档