当前位置: 首页 > 知识库问答 >
问题:

如何防止InputStream.ReadObject()引发EOfException?

赖浩荡
2023-03-14

我序列化一个对象并将其保存为我的硬盘上的文件。当我阅读它时,只有在某些情况下它会抛出EofException。经过几个小时的调试,我无法找到一个问题。

下面是我的代码:

   public void serialize(MyClass myClass,String path) {
        FileOutputStream foStream = null;
        ObjectOutputStream ooStream = null;
        try {
            File file = new File(path);
            if (!file.exists()) {
                file.createNewFile();
            }
            foStream = new FileOutputStream(file);
            ooStream = new ObjectOutputStream(foStream);
            ooStream.writeObject(myClass);
        } catch (Throwable t) {
            log.error(t);
        } finally {
            if (ooStream != null) {
                try {
                    ooStream.flush();
                    ooStream.close();
                } catch (IOException e) {
                    log.error(e);
                }
            }

        }
    }
  public MyClass deSerialize(String path) {
        MyClass myClass=null;
        FileInputStream fiStream = null;
        ObjectInputStream oiStream = null;
        String errorMessage = "";
        try {
            File file = new File(path);
            if (!file.exists()) {
                return null;
            }
            fiStream = new FileInputStream(path);
            oiStream = new ObjectInputStream(fiStream);
            Object o = oiStream.readObject();
            myClass = (MyClass) o;
        } catch (Throwable t) {
            log.warn(t);
        } finally {
            if (oiStream != null) {
                try {
                    oiStream.close();
                } catch (IOException e) {
                    log.error(e);
                }
            }
        }
        return myClass;
    }

问题:我的序列化对象现在被破坏了,然后它现在是垃圾吗?
因为这个对象负责呈现用户保存的UI。如果用户登录,它应该呈现以前保存的UI状态。但是,对于某些用户,文件无法反序列化。

共有1个答案

乐正迪
2023-03-14

EOFException表示您正在尝试读取文件的末尾。通常情况下,除了尝试之外,您没有任何方法知道是否还有更多的对象要读取,因此首先不应该将EOFException视为一个问题。如果它是在您认为知道文件中有更多对象的情况下抛出的,例如,当您为文件加上了一个对象计数的前缀时,它表示编写文件的代码有问题,或者文件本身可能已损坏。另一个例子是一个不应该是零长度的零长度文件。不管是什么问题,都不是阅读端能解决的,已经太晚了。

 类似资料:
  • 问题内容: 这是一个非常常见的问题,但我尚未找到我要寻找的确切问题和答案。 我有一个表,该表具有指向其自己的PK的FK,以启用任意深度的层次结构,例如经典的tblEmployee,它的列是带有PK tblEmployee.EmployeeID的FK。 假设在我的应用中,用户 创建新员工Alice和Dave,没有经理,因为他们是CEO和总裁。这两个记录的NULL也是如此。 创建新员工Bob,并以Al

  • 问题内容: 我们有三个Web服务(,,),其中每个服务映射到一个方法(在一个单独的Java类)( ,,)。 只能同时运行一项服务(即:无法在运行时运行)。但是,由于这是REST API,因此无法阻止客户端请求并发运行的服务。 在服务器上 强制 服务 不能 同时运行的最佳和最简单的方法是什么? 更新 :这是一个内部应用程序,我们的负载不会很大,只有一台应用程序服务器。 更新 :这是一个主观的问题,因

  • 目前,api看起来像:- 员工详情:- 所以问题是要避免xss攻击 例如,如果它是这段代码

  • 问题内容: 我正在Jenkins管道中以代码形式编写Android构建过程。脚本的相关部分是: 运行构建时,出现以下错误: 我相信该问题与get_current_time_date函数有关,但我不确定如何处理。 我已经在互联网上阅读了有关该错误的信息,发现可以去Jenkins-> Manage Jenkins->进程内脚本批准并批准某些代码运行,但是如何防止这种情况发生?我不确定应该批准哪个代码(

  • 问题内容: 我发现经典的Java Deadlock Tutorial 中包含对System.out.format的调用将防止死锁的发生,我不知道为什么。 下面的代码是相同的教程,与除的 这是输出: 删除违规行会导致通常的死锁: 对System.out.format的调用是否以某种方式改变了线程获取对象内在锁的方式? 更新: 通过更改代码中启动线程的位置,我能够使系统再次陷入僵局: 这就引出了一个问

  • 问题内容: 我的侧边栏中有一个使用嵌套列表( 和 标记)的分层导航菜单。我使用的预制主题已经具有列表项的样式,但是我想更改顶级项的样式,但不能将其应用于子项。是否有一种简单的方法可以将样式应用于顶级列表项标签,​​而无需将样式层叠到其子级列表项?我知道我可以在子项目中显式添加重写样式,但是如果有一种简单的方法,只是说“将这些样式应用于此类并且不要级联,我真的很想避免必须重复所有样式代码”他们将其归