我正试图在服务器端序列化一个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 类的构造函数后立即发生。
堆栈跟踪:
我已经发现了很多这种问题,但在调用readObject()之前,我没有看到其中一个出现这种错误的地方。
我已经尝试过的事情:
奇怪的是,当我第一次写入对象文件通过FileOutpuStream和访问这个文件(在服务器上)从客户端通过Url.openStream()然后ObjectOutpuStream可以读取这个对象完美,不幸的是,这将意味着很多麻烦,当多个用户试图检索这个对象在同一时间…
我希望你能帮我解决这个问题:)
一些疯狂的想法...尝试在您的回复中添加< 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包装它)。
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-试图理解“工厂”构造函数的价值”中工厂构造函数的用法。 恕我直言,使用通用构造函数,可以通过细微的差异实现相同的效果,但相当简单。 如上所示,尽管这两个实例 所以,