2013-02-28 65 views
3
System.out.println("Hello brave souls!"); 

我有幾個關於對象序列化的問題。我正在研究我的數學遊戲的新版本,並且忘記在最近三次會話中保存遊戲模式。記錄正在通過對象序列化來保存,這導致我在這裏。我想知道的是:對象序列化的魔法精靈

1.)對象序列化是否保持對象保存到文件的時間? 2.)在更改文件中的n個對象中的任意一個時,是否必須將要更改的對象加載到內存中(通過循環遍歷對象),更改它,然後將每個最後的對象重新寫回到文件? //似乎很單調

+1

我喜歡,儘管我自己。你得到一個+1。 – Perception 2013-02-28 00:42:59

+0

序列化與持久性不一樣。數據庫將是更好的選擇。 – whatnick 2013-02-28 01:45:11

回答

1

1)不執行對象序列化勉強保持在該對象被保存到文件的時間保持?

不。它保存對象,只保存對象,以及任何需要重新構造的對象,比如它的類名。

2.)在改變任何n個對象的文件

在不能改變任何文件中的Ñ對象。您必須將文件重建爲對象,更改對象並重新進行串行化。

//似乎有些單調乏味

這是乏味的。沒人說這不會很乏味。你正在使用它作爲數據庫。事實並非如此。這是一個序列化,這也意味着它是一個流。完全相同的情況適用於文本文件。

+0

關於對象序列化的另一個觀察/問題:我注意到,在將要修改的記錄反序列化爲.ser文件時,修改需要修改的記錄,然後將它們序列化到另一個.ser文件中,新創建的.ser文件是儘管在每個文件中都有相同數量的對象,但它比舊的還要小。有65個對象,我只是修改了其中三個對象的布爾值。任何人都可以解釋爲什麼這可能會發生? //我應該甚至擔心任何數據被擦除 – 2013-03-01 01:12:19

+1

@MikeWarren您可能遇到了ObjectOutputStream.reset()'是治癒的問題。您可能已經在每個對象後面寫入了具有重置的原始流,而不是以相同的方式寫入更新的流。 – EJP 2013-03-01 09:19:55

+0

考慮到我試圖製作的程序的性質,舊文件在每個對象後重置。實際上,我創建了一個類來擴展在writeStreamHeader()中調用reset()的ObjectOutputStream。但是,作爲一個測試,我嘗試使用如下對象複製這個對象序列化文件: for(int x = 0; x )olddata.readObject(); \t newdata.writeObject(記錄);!\t //並將其寫入新文件 } ,結果是一場災難 – 2013-03-03 11:38:20

3

序列化序列化整個對象圖。如果您要保存遊戲,您可能需要調用ObjectOutputStream.writeObject(myGame),它將遞歸地寫入整個遊戲對象及其引用的所有非瞬態屬性。

要更改它,請使用ObjectInputStream將遊戲加載到內存中,更改值並將其寫回。

如果您正在處理大量數據,您可能還想鏈接一個GZIPInputStream和GZIPOutputStream,它可以縮小序列化的大小。

如果你正在處理真正大的對象,嵌入式數據庫可能是一個更好的選擇,因爲你可以改變一個字段而不需要把整個東西加載到RAM中。最後,如果要在對象序列化時更新對象的時間戳,請在Serializable僞接口中實現writeObject方法。更新您的時間戳,然後在提供的ObjectOutputStream上調用defaultWriteObject。這會給你'最後堅持'的行爲。

private void writeObject(java.io.ObjectOutputStream out) throws IOException 
+0

這個問題需要解決,理由是我必須修改一些數據以確保它在正確的位置。另外,我計劃添加日曆功能。所以,我正在尋找一種方法來保存時間戳。我正在考慮做類似聲明一個文件輸出流,一個文件輸入流,一個對象輸出流和一個對象輸入流,將輸入流設置爲當前文件中的東西,然後將數據「轉儲」到文件由輸出流提供。 時間戳會是你明確必須保存的東西嗎? – 2013-02-28 06:04:00

+0

可能在實例化對象時(在構造函數中)而不是在序列化時創建時間戳。 – 2013-03-01 23:44:42