对于这个问题,假设序列化/反序列化是原子的,当对象被完全写入流并成功读出时,或者当对象被部分写入流时,当对象被读取回时发生异常。假设写入操作可能无法成功完成,例如由于电源中断。
在对Serializable类的描述中,我读到:
如果序列化流已被篡改,也可能发生这种情况;因此,尽管存在“敌对”或不完整的源流,
readObjectNoData对于正确初始化反序列化对象很有用。
这可能暗示这样一个事实:从ObjectInputStream读取对象不是原子的。这是否意味着从流中读取Java对象可能不是原子操作?
如果将部分对象写入持久内存,然后检索该对象,我是否确定会抛出异常?
如果Java序列化是非原子的,那么作为原子操作(反序列化)对象到持久内存有什么最佳实践吗?
备注:
ObjectInputStream和FileInputStream;发布于 2016-02-22 23:49:10
这可能暗示这样一个事实:从ObjectInputStream读取对象不是原子的。这是否意味着从流中读取Java对象可能不是原子操作?
我在任何地方都不知道它是原子的,但我也不知道它和你引用的摘录有什么关系。读取一个对象涉及相当多的读操作:标记、类名和所有字段,因此,按照您的意思,整个操作不可能是原子操作。
如果将部分对象写入持久内存,然后检索该对象,我是否确定会抛出异常?
我看不出你怎么能避免得到例外。
如果Java序列化是非原子的,那么是否有将对象序列化为作为原子操作的持久内存的最佳实践?
您无法确保会发生这种情况,但如果不这样做,则可以捕获抛出的异常。调用flush(),如果失败,则会出现不完整的序列化。
例如,对于原子,我的意思是写到磁盘时在断电期间会发生什么。
将对象写入磁盘也不是原子的。它们由几个逻辑写入组成。如果您的程序因为电源中断而停止,所以甚至没有得到IOException,那么您所拥有的只是一个短文件,在读取时会导致异常。
https://stackoverflow.com/questions/35548764
复制相似问题