1

是否可以从文件中反序列化对象,然后将其中的少数序列化到同一个文件中?当然,前后对象的数量必须相同。我不想将新对象添加到文件中,而是覆盖更改的对象。例如,我从文件“file.ser”中获得了大约 1000 个对象。我将它们反序列化,只更改 3 并希望将它们覆盖到同一个文件中。是否可以?

4

3 回答 3

1

不,您必须重新创建文件。对象流确实是一个流,而不仅仅是一组记录。

于 2012-04-03T23:37:26.670 回答
1

简短的回答是否定的,您不能只在文件中“就地”覆盖更改的对象。

当您创建 时ObjectOutputStream,甚至在您将对象写入其中之前,流都会将一些幻数标记字节写入底层流。ObjectInputStream当你创建一个字节时,这些字节会被自动消耗掉。这是流标头。

此外,当您使用 编写对象时ObjectOutputStream.writeObject(),您不仅仅是将该对象序列化为隔离。流跟踪它之前序列化的对象引用(除非您调用reset()),而不是完整地写出对象,它会写一个句柄,指向写回真实对象的位置。

最后,写入流的对象之间没有块对齐或填充——它们是连续写入的。

所有这一切都意味着,如果您更改对象,您所做的结构更改(对不同对象的引用等)意味着句柄可能不同,并且对象的长度可能不同。由于没有发生块对齐,因此您不能将对象写回同一位置,因为您所做的更改(可能)会影响长度并且不会相同,这意味着您会踩到另一个物体的顶部。

于 2012-04-03T23:58:29.383 回答
0

如果您关心速度,我一直发现 Java 非常快。阅读整篇文章可能不会受到太多惩罚 - 尝试一些分析。

您可以尝试用 Google Protocol Buffers 等替代方法替换 Java 序列化。

ProtoBuf 非常快速且非常节省空间。

于 2012-04-04T21:47:18.843 回答