2016-04-28 89 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