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