[英]Java OptionalDataException when only serializing objects (no primitive data types anywhere)
我正在處理一個我不知道的奇怪的OptionalDataException。
我有一些進來的對象,這些對象是通過裝飾OutputObjectStream
並調用其writeUnshared
方法將其寫入磁盤的類所保存的。 定期每10000個對象調用一次flush
和reset
。 最后,它關閉流。
這樣,我創建了少量只包含序列化對象的文件。
就是這個 寫入所有這些文件后,我將它們配對並嘗試對它們進行歸類排序。 此時,文件的大小沒有改變(如預期的那樣)。
為此,我首先打開兩個流,並在每個流上調用readObject
。
但是,每次對readObject
調用(每個流的第一個調用)都會拋出OptionalDataException
,每次都是eof = false, length = 4
,據我了解,這表明我正在讀取原始數據類型,或者發生了其他事情,我沒有。
好的,需要分享。
我為ObjectOutputStream創建了一個包裝器,正如我所說,該包裝器計算了序列化對象的數量,以便定期調用reset
。
問題出在該類的構造函數中,基本上是:
class CustomObjectOutputStream extends ObjectOutputStream {
private int flushBoundary;
CustomObjectOutputStream(ObjectOutputStream oos, int flushLimit){
super(oos);
...
}
//other methods
}
現在,仔細查看javadoc頁面會發現 :
創建一個ObjectOutputStream寫入指定的OutputStream。 該構造函數將序列化流標頭寫入基礎流; 調用者可能希望立即刷新該流,以確保用於接收ObjectInputStreams的構造函數在讀取標頭時不會阻塞。
這意味着在文件開始時存在“一些額外的內容”。 我將super()調用更改為默認調用,並且OptionalDataExceptions消失了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.