所以我试图写一个ByteArray的对象,但由于某种原因,它没有写任何东西,我看到返回值为0的事实,并且由于读取它导致了异常。
BAoutput = new ByteArrayOutputStream();
Oout = new ObjectOutputStream(BAoutput);
Oout.writeObject(receiver);
其中receiver
是我通过参数得到的对象。
并且例外总是相同的:
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
有什么想法吗?
大部分代码:(上面有几个定义,真的没什么有趣的)
try {
BAoutput = new ByteArrayOutputStream();
Oout = new ObjectOutputStream(BAoutput);
BAinput = new ByteArrayInputStream(BAoutput.toByteArray());
Oin = new ObjectInputStream(BAinput);
Oout.writeObject(receiver);
retval = method.invoke(receiver, args);
for (Method curr: postMethods){
curr.setAccessible(true);
if (curr.invoke(receiver).equals(false)){
receiver = Oin.readObject();
throw new PostconditionFailure();
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
Oin.close();
Oout.close();
BAinput.close();
BAoutput.close();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
要检查的第一件事:
receiver
是Serializable(或原始类型)答案 1 :(得分:0)
这对我来说没有多大意义。
所以我试图写一个ByteArray的对象,但由于某种原因它没有写任何东西,我通过返回值为0的事实看到
什么是0? writeObject
方法根本不返回任何值 - 它是void
方法!
......而且阅读它会导致异常。
这并不一定意味着写入失败。
我认为我们需要看>>>所有<<<与读取和写入有关的代码,包括类型声明和任何封闭的try / catch块。
编辑
现在我看到了完整的代码,很清楚真正的问题是什么:
....
BAoutput = new ByteArrayOutputStream();
Oout = new ObjectOutputStream(BAoutput);
BAinput = new ByteArrayInputStream(BAoutput.toByteArray());
Oin = new ObjectInputStream(BAinput);
...
ByteArrayOutputStream.toByteArray()
方法返回流的当前内容的副本。由于尚未向流写入任何内容,因此字节数组自然为空。
您的问题的解决方案是提取字节数组并在写完ByteArrayInputStream
之后构建Oout
并刷新或关闭它。