我正在使用 ObjectOutputStream 创建序列化对象的文件。然后,我使用 ObjectInputStream 和 readObject() 方法将对象从文件中取出。
第一次效果很好。这意味着如果该文件不存在并且我打开它然后附加任意数量的对象,我可以打开 ObjectInputStream 对象并访问所有对象。
但是,如果我随后打开同一文件(使用追加选项)并添加更多对象,则 ObjectInputStream 对象会在新对象应开始的位置出现 java.io.StreamCorruptedException: "invalid type code: AC" 错误。
还有其他人遇到过这个吗?我什至回顾了 Deitel 书中的一些基本教科书示例,但仍然遇到相同的错误。
编辑:我发现这个 - 一旦序列化流在追加模式下关闭并重新打开,您就不能追加到序列化流的末尾。写入看起来会起作用,但是当您稍后读取该文件时,您将收到 java.io.StreamCorruptedException。在 ”http://mindprod.com/jgloss/gotchas.html#序列化 http://mindprod.com/jgloss/gotchas.html#SERIALIZATION"
每个对象都作为对象流的一部分而不是作为个体进行序列化。与大多数文件格式(但不是 ZIP!)一样,“对象流序列化协议”也有一个标头。这就是每一个新ObjectInputStream
期望仅在文件的开头查找。将其放在流中间是行不通的。此外,流具有反向引用,因此不会两次写出对象(除非另有说明)。
所以你需要的是创建一个新的ObjectInputStream
匹配每一个ObjectOutputStream
。有一些内部缓冲,如果这导致问题,您需要先对流进行切片,然后再让Object(In|Out)putStream
at it.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)