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

EOFException 同时构造 ObjectInputStream

郑景胜
2023-03-14

我正试图在服务器端序列化一个HashMap(Tomcat 6 . 0 . 29 ),并在客户端android应用程序上反序列化它。

我第一次尝试这个,我得到了StreamCoruptedExc的,但在我创建了一个全新的servlet与干净的doget/doPost-方法,我已经设法解决了这个问题,不幸的是,我得到了一个EOF异常,而不是。

所以,首先我发布我的代码,然后我将详细解释我的问题:

服务器端代码(这将在调用doPost或doGet时执行):

    if ("object".equals(request.getParameter("format")))
        {

            trace.log("Before Serializing");
            ObjectOutputStream out = null;
            try
            {
                out = new ObjectOutputStream(response.getOutputStream());
                out.writeObject(outerTable);
                trace.log("after Serializing");
            }
            finally
            {
                if(out != null)
                {
                    try
                    {
                        out.flush();
                        out.close();
                    }
                    catch(Exception ex)
                    {
                        trace.log("Exception has been thrown "+ex.getMessage());
                    }
                }
            }
            trace.log("after closing stream");
        }
        else
        {
            PrintWriter out = response.getWriter();
            out.println(outerTable.toString());
        }

outerTable是一个HashMap,它正好在这个代码块之前创建,并且总是有正确的值。

服务器端没有抛出错误。当我尝试使用参数“?格式=对象”在我的网络浏览器中访问servlet时,我得到了整个序列化字符串。

Android应用程序脚本(此方法在按下特定按钮后执行超文本传输协议html" target="_blank">请求):

    private synchronized void performNetworkAccess()
    {
  Runnable run = new Runnable()
  {
    @Override
    public void run()
    {
    System.out.println("in run()-Method");
    ObjectInputStream objInput = null;
    try
    {
        URL url = new URL(myWebsite);
        URLConnection con = url.openConnection();
        InputStream in = con.getInputStream(); 
        objInput = new ObjectInputStream(in);

        outerTable = (HashMap<String, HashMap<String, Object>>)              objInput.readObject();
        synchronized (monitor)
        {
        monitor.notifyAll();
        }
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
    finally
    {
        if (objInput != null)
        {
        try
        {
            objInput.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        }
    }

    }

};
Thread t1 = new Thread(run);
t1.start();
}

异常在调用 ObjectInputStream 类的构造函数后立即发生。

堆栈跟踪:

  • W/系统。错误(1797):java.io。EOF异常
  • W/系统。错误(1797):位于libcore.io.Streams.readFully(Streams.java:83)
  • W/系统。错误(1797):位于java.io.DataInputStream.readShort(DataInputsStream.java:169)
  • W/系统。错误(1797):位于java.io.ObjectInputStream.readStreamHeader(ObjectInputsStream.java:2102)
  • W/系统。错误(1797):位于java.io.ObjectInputStream.(ObjectInput Stream.java:372)
  • W/系统。错误(1797):在de.tesla.jthesucontactsync.ContactSync$4.run(ContactSync.java:602)
  • W/系统。错误(1797):在java.lang.Thread.run(Thread.java:856)

我已经发现了很多这种问题,但在调用readObject()之前,我没有看到其中一个出现这种错误的地方。

我已经尝试过的事情:

  • 在构造ObjectOutpuStream后不久添加out.flush()
  • 删除out.flush和/或out.close方法
  • 用BufferedInpu-/-OutpuStream包装In的输入/输出流
  • 将流作为文件检索并尝试将文件反序列化

奇怪的是,当我第一次写入对象文件通过FileOutpuStream和访问这个文件(在服务器上)从客户端通过Url.openStream()然后ObjectOutpuStream可以读取这个对象完美,不幸的是,这将意味着很多麻烦,当多个用户试图检索这个对象在同一时间…

我希望你能帮我解决这个问题:)

共有2个答案

艾意蕴
2023-03-14

一些疯狂的想法...尝试在您的回复中添加< code>Content-Length标题。可能意味着将您的字节写入ByteArrayOutputStream,测量大小,设置标头,然后才写入响应...但这可能是URLConnection过早切断连接的原因...

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObejctOutputStream oos = new ObejctOutputStream(baos);
oos.write(...);

byte[] data = baos.toByteArray();

response.setHeader("Content-Length", "" + data.length);
response.getOutputStream().write(data);

序列化

@Robert评论是对的。Java 序列化不用于不同环境之间的通信。如果你在JVM和Dalvik之间工作,那就更多了。所以另一个框架会更合适(XML或JSON的东西可能很好,甚至用GZip[]Stream包装它)。

公良向阳
2023-03-14

servlet 有某种异常,甚至没有构造 ObjectOutputStream。在尝试在客户端构造 ObjectInputStream 之前,您需要检查 200 的响应代码

 类似资料:
  • 问题内容: 我想读取已输出到.dat文件的多个对象(我自己的类Term),但始终会得到nullPointException或EOFException。 问题答案: 请参阅Javadoc。在EOF处不返回null。它抛出异常返回null的唯一方法是在另一端写了null,这不一定是终止读取循环的一个好理由。 简而言之,您的代码是错误的。 注意,“ o”的初始化是多余的。 注意(2)您发布的代码不能为空

  • 我是Spring框架的新手。我试图用注入方法(Setter和构造函数)注入依赖关系。我期待在 setter 注入中定义的输出,因为它被构造函数注入覆盖。但是,我收到了如下错误消息 Bean创建异常:未找到默认构造函数 如果我们同时应用两种注入方法,会不会出错?

  • 我的项目是使用spring-boot web socket和嵌入式tomcat来实现聊天服务器。一切正常,但有时我得到了EOFException,然后客户端不能向聊天服务器发送消息,直到我重新启动tomcat,然后一切正常。我不知道EOFException什么时候会发生。Pls帮帮我 [TRACE]2017-10-23 06:17:10.707[http-nio-7755-exec-4]Nativ

  • 我使用自定义授权标头对http请求进行签名: 所以这个异常不同于最初的异常。当我移除头部并禁用webservice上的授权时,连接将按预期工作。所以问题似乎出在自定义授权标头上。有什么想法吗?

  • 我正在尝试实现一个“帐户”列表的加载/保存,其方法与我成功使用的一个HashMap类似。 背景: 在这里我想设置我的帐户列表包括保存的帐户。 加载/保存实现: 问题是,当我第一次初始化AccountManager时,accounts.ser文件没有保存的帐户,因为该功能是在稍后的方法中实现的,因此给出了以下例外情况: 我尝试在捕获EOFExceptions时将account设置为新的ArrayLi

  • 在Dart中,工厂构造函数需要编码器提供更多逻辑,但与常量构造函数没有太大区别,只是它们允许“非最终”实例变量。 与const Constructor相比,它们有哪些优点? 谢谢大家。 编辑 下面是关于Seth Ladd博客“Dart-试图理解“工厂”构造函数的价值”中工厂构造函数的用法。 恕我直言,使用通用构造函数,可以通过细微的差异实现相同的效果,但相当简单。 如上所示,尽管这两个实例 所以,