【问题标题】:How to workaround readObject similar to readLine如何解决类似于 readLine 的 readObject
【发布时间】:2014-04-19 05:30:15
【问题描述】:

我正在读取一个包含许多序列化对象的文件。 我想反序列化它们并意识到我们不能像readLine 那样使用readObject,即

while (ois.readObject != null) {

}

会抛出异常。据我所知,我们也没有hasNextnext 之类的机制。

在现实世界中读取对象的问题是如何解决的?

【问题讨论】:

    标签: java serialization io


    【解决方案1】:

    捕捉 EOFException,当你得到它时关闭和中断。

    readObject() 仅在您写入 null 时才返回 null,这并不一定意味着流的结束。

    【讨论】:

    • 这是常见的做法吗?还是必要的黑客攻击?
    • 除非您可以限制或重新定义写入流的内容,否则这是唯一的解决方案。当然不是“黑客”。相反,它是已定义的行为,它与除 readLine() 之外的所有其他 readXXX() 方法共享。
    【解决方案2】:

    假设您正在尝试加载 Person 对象,您可以尝试以下操作:

            ArrayList<Person> persons = new ArrayList();
            while (true) {
                try {
                    persons.add((Person) ois.readObject());
                } catch (EOFException e) {
                    break;
                }
            }
    

    或者,您可以将对象添加到数组或数组列表并序列化列表对象,而不是序列化单个对象。然后您可以轻松地反序列化列表对象,而不必处理EOFException。请参阅John Purcell's serialization tutorial 中的示例。

    【讨论】:

    • 或者你可以把循环放在try里面。这样你就可以避免break。在您之前的代码中,它还可以避免第二级 try/catch
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2022-11-16
    • 2010-10-31
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多