【问题标题】:Java OptionalDataException when only serializing objects (no primitive data types anywhere)仅序列化对象时的 Java OptionalDataException(任何地方都没有原始数据类型)
【发布时间】:2013-10-15 20:35:27
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java serialization optionaldataexception


    【解决方案1】:

    好的,需要分享这个。

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

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

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

    现在,仔细观察 the javadoc page 会发现

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

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

    【讨论】:

    • 当您已经从 ObjectOutputStream 继承时,为什么还要使用它作为委托?参数应该是OutputStream,,它应该ObjectOutputStream.,你应该调用super(os,...).
    • 这是技术。债务。将在不久的将来进行更改。 super 通话中的 ldots 是怎么回事?
    • 技术债务?白痴?你在说什么?
    猜你喜欢
    • 2020-06-20
    • 2022-12-19
    • 2012-09-08
    • 2018-06-22
    • 2016-03-30
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多