是否可以从文件中反序列化对象,然后将其中的少数序列化到同一个文件中?当然,前后对象的数量必须相同。我不想将新对象添加到文件中,而是覆盖更改的对象。例如,我从文件“file.ser”中获得了大约 1000 个对象。我将它们反序列化,只更改 3 并希望将它们覆盖到同一个文件中。是否可以?
3 回答
不,您必须重新创建文件。对象流确实是一个流,而不仅仅是一组记录。
简短的回答是否定的,您不能只在文件中“就地”覆盖更改的对象。
当您创建 时ObjectOutputStream
,甚至在您将对象写入其中之前,流都会将一些幻数标记字节写入底层流。ObjectInputStream
当你创建一个字节时,这些字节会被自动消耗掉。这是流标头。
此外,当您使用 编写对象时ObjectOutputStream.writeObject()
,您不仅仅是将该对象序列化为隔离。流跟踪它之前序列化的对象引用(除非您调用reset()
),而不是完整地写出对象,它会写一个句柄,指向写回真实对象的位置。
最后,写入流的对象之间没有块对齐或填充——它们是连续写入的。
所有这一切都意味着,如果您更改对象,您所做的结构更改(对不同对象的引用等)意味着句柄可能不同,并且对象的长度可能不同。由于没有发生块对齐,因此您不能将对象写回同一位置,因为您所做的更改(可能)会影响长度并且不会相同,这意味着您会踩到另一个物体的顶部。
如果您关心速度,我一直发现 Java 非常快。阅读整篇文章可能不会受到太多惩罚 - 尝试一些分析。
您可以尝试用 Google Protocol Buffers 等替代方法替换 Java 序列化。
ProtoBuf 非常快速且非常节省空间。