[英]Java OptionalDataException when only serializing objects (no primitive data types anywhere)
我正在处理一个我不知道的奇怪的OptionalDataException。
我有一些进来的对象,这些对象是通过装饰OutputObjectStream
并调用其writeUnshared
方法将其写入磁盘的类所保存的。 定期每10000个对象调用一次flush
和reset
。 最后,它关闭流。
这样,我创建了少量只包含序列化对象的文件。
就是这个 写入所有这些文件后,我将它们配对并尝试对它们进行归类排序。 此时,文件的大小没有改变(如预期的那样)。
为此,我首先打开两个流,并在每个流上调用readObject
。
但是,每次对readObject
调用(每个流的第一个调用)都会抛出OptionalDataException
,每次都是eof = false, length = 4
,据我了解,这表明我正在读取原始数据类型,或者发生了其他事情,我没有。
好的,需要分享。
我为ObjectOutputStream创建了一个包装器,正如我所说,该包装器计算了序列化对象的数量,以便定期调用reset
。
问题出在该类的构造函数中,基本上是:
class CustomObjectOutputStream extends ObjectOutputStream {
private int flushBoundary;
CustomObjectOutputStream(ObjectOutputStream oos, int flushLimit){
super(oos);
...
}
//other methods
}
现在,仔细查看javadoc页面会发现 :
创建一个ObjectOutputStream写入指定的OutputStream。 该构造函数将序列化流标头写入基础流; 调用者可能希望立即刷新该流,以确保用于接收ObjectInputStreams的构造函数在读取标头时不会阻塞。
这意味着在文件开始时存在“一些额外的内容”。 我将super()调用更改为默认调用,并且OptionalDataExceptions消失了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.