2013-10-01 30 views
1

我想將N個對象序列化到一個文件。無論何時我序列化一個對象列表,我都會在序列化對象之前將對象編號寫入一個int中。雖然反序列化,我首先讀取int值,我會得到我必須調用ObjectInputStream.readObject()的次數。雖然序列化一個java對象到一個文件是可以在序列化文件的開頭插入一個對象

但是在這種情況下,只有在運行時才知道N的值。

FileOutputStream fout = new FileOutputStream("c:\\testfile"); 
ObjectOutputStream oos = new ObjectOutputStream(fout); 

oos.writeInt(/* number of objects here */); <- Can't do as the total is unknown till 
               last object is encountered 

/* done N-times 
oos.writeObject(eachString); 
*/ 

oos.close(); 
fout.close(); 

我嘗試這樣做,這是行不通的

RandomAccessFile f = new RandomAccessFile("c:\\testfile", "rw"); 
f.seek(0); // to the beginning 
f.writeInt(s.size()); 
f.close(); 

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 00000003 
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801) 
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298) 
at testPack.testSerialization.main(testSerialization.java:44) 

我已經過了這個問題了

Java Serialization

我不想寫了N個目標作爲一個列表,因爲這需要我將整個列表保存在內存中。

所以,我想知道是否有另一種方式來做到這一點,這將涉及到更改序列化文件的內容(在頂部插入int值)。

+0

的readObject會拋出一個異常時,有沒有讀取對象...爲什麼不讀,直到拋出異常,並且抓住它 – Thihara

+0

我同意,我們能趕上EOFException類。這是我暫時想要的方法。但是,我仍然很好奇它是否也可以以其他方式完成。 – user2070649

+0

Klas的方法顯示了一些承諾...你確定它不會工作? – Thihara

回答

0

你有沒有想過把對象放在一個ArrayList中,並對ArrayList本身進行序列化/反序列化?

ArrayList implements Serialisable...

+1

是的,但這樣做需要我將整個ArrayList保存在我不想做的內存中在所有。我要寫的對象數量可能會很多。 – user2070649

+0

您只能爲serialize創建數組。如果它們已經在內存中,那麼將它們放入一個ArrayList中將不會有很大的改變(它只包含指針)。另一種選擇是將它們分別保存在不同的文件中。我不建議嘗試保存一個容器並直接從文件中提取一個對象 –

+0

對象從文件到達並在經過一些處理後寫入。在任何給定的時間,我只在內存中保存1或2個對象。 – user2070649

相關問題