2010-05-21 79 views
0

有沒有一種通用的方式來緩存任何類型的對象(在Java類或Word文檔等)到內存或磁盤?如何將任何*對象類型緩存到java中的內存/磁盤?

只是序列化對象,並保留文件擴展名(如果它有一個)足以重建對象?

+0

好像你應該更清楚地闡明你的問題中的一些觀點。你究竟想要實現什麼類型的東西? – User 2010-05-21 16:08:40

回答

1

不確定「or word document」是什麼意思。序列化可以用於磁盤緩存,但不確定在內存中使用它的目的是什麼,因爲只保留原始對象可能會快得多。

更強大的解決方案可能是ehcache它可以管理緩存的大小以及在內存和磁盤之間移動它。

4

您似乎在使用Object這個詞來描述2個不同的事物。

如果您的對象是一個Java對象,那麼如果您使用java方法來序列化/反序列化對象,那麼讓該對象實現Serializable就足夠了。

如果要從文件系統中緩存任意數據,最好的方法是在字節數組(或ArrayList)中讀取它。然後你可以把數組寫回磁盤或者你想要的地方。

3

如果你在談論內置的Java serialization,那麼你甚至不需要保留文件擴展名。序列化表單具有足夠的信息,這樣反序列化過程將生成一個完全相同的對象,而無需任何其他幫助。不過,根據代碼結構的不同,您可能需要爲自己的自己的好處存儲一些元數據,以便知道如何將結果Object轉換爲。

注意,Java序列化似乎並不適合您的需求,雖然 - 它不能序列任何類型的對象,只有那些實現Serializable。也許你需要更多地考慮「簡單地序列化對象」的含義,因爲這是一個問題。

3

有一類對象不能以有意義的方式反序列化。想想一個正在傳輸文件的開放式網絡連接。您無法將其存儲到磁盤,關閉您的應用程序,打開您的應用程序,反序列化該連接並期望它「繼續」。

Java有一個接口Serializable,它表明一個對象可以被序列化。這取決於你確保這確實是可能的。如果所有持有的數據都是可序列化的,或者不是可序列化的數據標記爲瞬態的,那麼通常情況下,對象是可序列化的。

這並不是說在理論上,你不能將內存內容作爲字節流轉儲到文件中,並在以後再讀回。你可以建立像我想的那樣的東西。但是,期望它的作用完全不同。

總之,不可能序列化任何類型。但是,有一種通用的方法來序列化標記爲Serializable的Java對象。

0

如果您想知道該問題的跨平臺(磁盤或內存)持久性部分,請參閱Java的Preferences類。

-2

您不能序列化Java中的任何對象。此外,Java使用淺拷貝(或稱爲別的東西)來進行序列化,所以如果你想要像HashMap那樣分離它,它可能不會保存你的數據。

+0

事實並非如此。 – paulmurray 2011-02-24 00:02:12

0

我的,很多答案!

任何對象都可以通過實現java.io.Serializable使其自身可序列化。

但是:

默認串行器被ObjectOutputStream中,它只是走對象樹來實現。這對於簡單的javabean類型對象來說很好,但是它可能會產生不希望的效果,比如系統對象被序列化(我曾經檢查過一個序列化的java對象文件,發現它包含了所有系統時區對象)。當然,如果你的對象內部有不可序列化(而不是暫態)的對象,那麼ObjectOutputStream將拋出一個異常。

(實際上,即使是JavaBean對象的默認的序列是可怕的 - 默認的串行發出java.lang.String中的每一個字符串字段的類名。)

所以,如果你的對象是複雜的,那麼你真的應該實現Externalizable並用一些智能編寫串行器和解串器。

http://download.oracle.com/javase/6/docs/platform/serialization/spec/serial-arch.html#7185

所以基本上 - 不,你不能連載任何舊的對象。你必須設計意圖被序列化的對象,理想情況下,他們對於自己如何進入和離開流有一些智慧。