2016-04-28 124 views
1

假設我有一個包含很多已經序列化的對象的大文件(這是很容易的部分)。當我去反序列化時,我需要能夠隨機訪問文件中的對象。我認爲這樣做的唯一方法是以某種方式將文件指針存儲到每個對象。反序列化Java中的對象

基本上我最終會得到一個大型的序列化對象文件,並且當我去檢索一個對象時,不想反序列化整個文件。

任何人都可以指出我正確的方向嗎?

+0

如何使用某種對象DB?像[Neodatis](http://neodatis.wikidot.com/)(還有很多其他的,請參閱[維基百科頁面](https://en.wikipedia.org/wiki/Comparison_of_object_database_management_systems)) – 2016-04-28 18:12:51

+0

如果您序列化將該對象轉換爲目錄結構,並在目錄的頂層有一個查找文件。每次你需要一個對象時,你都要解析查找文件,然後抓取你需要的特定對象文件。只是一個想法。 –

+0

我正試圖在文件上存儲一個skiplist ...所以我需要序列化和反序列化跳過節點。有沒有什麼方法可以使用跳過列表來訪問我需要的節點?我覺得我仍然需要一個文件指針來獲得正確的對象 –

回答

1

你不能。出於某種原因,序列化被稱爲序列化。它是連續的。隨機訪問一個對象流將無法正常工作,原因包括流標頭,對象句柄,...

+0

爲什麼不將文件指針存儲到對象開始工作的位置?我認爲這就是我們應該做的......使用句柄來存儲起始位置和長度,然後反序列化。這會工作嗎? –

+0

@LoganM因爲之前的序列化對象不會被重新序列化。如果對象包含已經在流中序列化的成員,則不會重新序列化。所以對象的正確反序列化依賴於讀取整個流到那個點。 – EJP

0

直序列化永遠不會是您想要的解決方案。 該名稱的serial部分表示該對象線性寫入ObjectOutputStream

序列化格式衆所周知, 這裏是一個link到java 6序列化格式。

您有幾種選擇:

  1. 反序列化整個文件,並從那裏走。
  2. 編寫代碼以讀取序列化文件並生成索引。 甚至可能將索引存儲在文件中供將來使用。
  3. 放棄對文件的序列化並將對象存儲在數據庫中。
+0

索引不起作用。整個流必須被讀取到所需對象的位置。 – EJP