Java / Serializable - 仅覆盖已更改的对象

时间:2012-04-03 23:07:28

标签: java serialization

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

创建ObjectOutputStream时,即使在将对象写入其中之前,该流也会将一些magic number marker bytes写入基础流。创建一个字节时,ObjectInputStream会自动使用这些字节。这是流标题。

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

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

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

答案 2 :(得分:0)

如果你担心速度,我总是发现Java非常快。在阅读整篇文章时可能没有太多的惩罚 - 尝试一些分析。

您可以尝试使用Google Protocol Buffers等替代方案替换Java Serialization。

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