2016-12-06 91 views
5

今天我遇到了java序列化和反序列化中的奇怪行爲(「奇怪」,因爲我不明白)磁盤空間有多低可能導致java。 IO。 EOFException

我是從linux共享目錄序列化和反序列化一個對象。 序列化所有工作沒有任何問題,但當我試圖反序列化同一個文件時,它會拋出 java. io. EOFException。此外,反序列化僅對此新創建的文件失敗,並且正在處理該目錄中的所有其他舊文件。

所以我在互聯網上搜索,發現一個線程表示低磁盤空間也可能是這個錯誤的原因。

所以我清理了一些臨時文件,並說它工作。我不明白多麼低的磁盤空間只能影響反序列化和不序列化?

我正在使用apache commons SerializationUtils類。下面是序列化和反序列化的代碼

SerializationUtils. serialize(myObject, new FileOutputStream(new File(sharePath+FILEName) ; 


MyObject object=SerializationUtils. deserialize(new FileInputStream(new File(sharePath+FILEName); 

如果有人能解釋這種行爲,那將是非常有用的。我懷疑它在SerializationUtils中的一個錯誤可能會吞噬IOException。

感謝

+0

它不能,除非在寫入*文件時忽略先前的IOException。 – EJP

+0

由於我沒有手動進行序列化,所以IOExceptions由SerializationUtils管理。它在他們的javadoc中。 –

+0

所以這是他們的問題,或者他們糟糕的API設計。 – EJP

回答

7

我懷疑是寫文件時,一個IOException異常被拋出,因爲磁盤空間已用完,但串行數據的開始仍然寫入磁盤。這意味着存儲在磁盤上的序列化數據不完整,因此讀取它會導致無效的結果,在您的情況下導致EOF異常

爲了解決此問題,您需要查看何時發生IO異常由於磁盤空間不足導致exception.getMessage()丟失,並確保不寫入不完整的數據。

+0

M使用apache的commons,我找不到它的聲明證據..只有當我發現某些東西是吞噬IOException在Apache的SerializationUtils .. –

+0

您是否想趕上SerializationException?因爲這將被拋出,而不是IOException,如果寫入文件會拋出IOException –