0

我正在处理一个我无法弄清楚的奇怪的 OptionalDataException。

我有对象进来,它们由一个类保存到磁盘,该类通过装饰OutputObjectStream并调用其writeUnshared方法来编写它们。定期,每 10000 个对象,它调用flushreset。最后,它关闭流。

这样,我创建了少量只包含序列化对象的文件。

事情就是这样。写完所有这些文件后,我拿了一对并尝试对它们进行归并排序。此时,文件的大小没有改变(如预期的那样)。

为此,我首先打开两个流并调用readObject每个流。

但是,每次调用readObject(每个流上的第一个)都会抛出,据我所知,这表明我正在读取原始数据类型,或者正在发生其他我没有得到的事情。OptionalDataExceptioneof = false, length = 4

4

1 回答 1

0

好的,需要分享这个。

我为 ObjectOutputStream 创建了一个包装器,正如我所说,它计算了序列化对象的数量以便reset定期调用。

问题出在该类的构造函数中,基本上是:

class CustomObjectOutputStream extends ObjectOutputStream {

    private int flushBoundary;

    CustomObjectOutputStream(ObjectOutputStream oos, int flushLimit){
               super(oos);
               ...
     }
   //other methods
}

现在,仔细看看javadoc 页面

创建一个写入指定 OutputStream 的 ObjectOutputStream。此构造函数将序列化流标头写入底层流;调用者可能希望立即刷新流,以确保接收 ObjectInputStreams 的构造函数在读取标头时不会阻塞。

这意味着文件开头有“一些额外的东西”。我将 super() 调用更改为默认调用,并且 OptionalDataExceptions 消失了。

于 2013-10-15T22:36:06.350 回答