簡體   English   中英

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

[英]Is Java (de-)serialization atomic?

對於此問題,假定當對象被完全寫入流並成功讀出時,或者當對象被部分寫入流並且當讀回對象時發生異常時,序列化/反序列化是原子的。 假設例如由於斷電,寫入操作可能無法成功完成。

Serializable類的描述中,我讀到:

如果序列化流已被篡改,也可能會發生這種情況。 因此,盡管源流“敵對”或不完整,但readObjectNoData對於正確初始化反序列化的對象很有用。

可能暗示着從ObjectInputStream讀取對象不是原子的事實。 這是否意味着從流中讀取Java對象可能不是原子操作?

如果將部分對象寫入持久性存儲器然后進行檢索,我是否確定會引發異常?

如果Java序列化不是原子的,那么是否存在將對象作為原子操作(反序列化)到持久性內存的最佳實踐?


筆記:

  • 我在這里不考慮序列化到數據庫(例如使用Hibernate)。 對於持久存儲,我的意思是例如使用ObjectInputStreamFileInputStream ;
  • 對於原子,我的意思是,例如,在對象寫入磁盤后發生斷電之后,讀取對象期間會發生什么;
  • 我沒有使用多線程從流中讀取或寫入對象。

這可能暗示着從ObjectInputStream讀取對象不是原子的事實。 這是否意味着從流中讀取Java對象可能不是原子操作?

在您所指的意義上,我在任何地方都不知道有任何陳述原子的,但我也看不出它與您引用的摘錄有什么關系。 讀取一個對象涉及許多讀取操作:標記,類名和所有字段,因此,按照您的意思,整個操作不可能是原子的。

如果將部分對象寫入持久性存儲器然后進行檢索,我是否確定會引發異常?

我看不出您如何避免遇到例外。

如果Java序列化不是原子的,那么是否存在將對象序列化為原子操作的持久化內存的最佳實踐?

您無法確定它是否會發生,但是您可以捕獲未引發的異常。 調用flush() ,如果失敗,則序列化不完整。

原子的意思是,例如,寫磁盤時斷電期間會發生什么

將對象寫入磁盤也不是原子的。 它們由幾個邏輯寫入組成。 如果您的程序由於斷電而停止運行,甚至沒有得到IOException ,那么您所擁有的只是一個短文件,在讀取時會導致異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM