繁体   English   中英

仅在序列化对象时Java OptionalDataException(任何地方都没有原始数据类型)

[英]Java OptionalDataException when only serializing objects (no primitive data types anywhere)

我正在处理一个我不知道的奇怪的OptionalDataException。

我有一些进来的对象,这些对象是通过装饰OutputObjectStream并调用其writeUnshared方法将其写入磁盘的类所保存的。 定期每10000个对象调用一次flushreset 最后,它关闭流。

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

就是这个 写入所有这些文件后,我将它们配对并尝试对它们进行归类排序。 此时,文件的大小没有改变(如预期的那样)。

为此,我首先打开两个流,并在每个流上调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM