StreamCorruptedException:无效的types代码:AC
我的问题是当它试图读取对象的第二次,它会引发exception:
java.io.StreamCorruptedException: invalid type code: AC at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at Client.run(BaseStaInstance.java:313) java.io.StreamCorruptedException: invalid type code: AC at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at Client.run(BaseStaInstance.java:313)
我第一次发送完全相同的对象消息; 但是,当我第二次尝试做同样的事情时,会抛出上面的错误。 我是否需要重新初始化readObject()方法? 我甚至打印出下面一行正在接收的消息对象,它和第一个实例一样正确。
Object buf = myInput.readObject();
我假设有追加的问题,但我真的没有用于追加。 我只是想每次都读一条新线。 我真的很感谢在修复这个bug方面的一些帮助。 谢谢。
==================================
在这之前,我只是在run()方法中为套接字创buildinput和输出对象。 对象声明在类的run()方法之外:
@Override public void run() { try { sleep((int) 1 * 8000); } catch (Exception e) { e.printStackTrace(); } try { //Creating input and output streams to transfer messages to the server myOutput = new ObjectOutputStream(skt.getOutputStream()); myInput = new ObjectInputStream(skt.getInputStream()); while (true) { buf = myInput.readObject(); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { } catch (Exception e) { e.printStackTrace(); } } }
你是对的; 我不closures对象。 我不知道该怎么做。
底层的问题是,您正在使用新的ObjectOutputStream
来写入已经使用之前的ObjectOutputStream
写入的现有ObjectInputStream
。 这些stream具有由相应的构造函数写入和读取的头文件,因此如果您创build另一个ObjectOutputStream
,则将编写一个新的头文件,并以此开始 – 猜测是什么? – 0xAC,
现有的ObjectInputStream
在这一点上并不期待另一个头,所以它barfs。
在@trashgod引用的Java论坛主题中,我应该忽略“重新为每个对象的两端”部分:这只是浪费。 在套接字的生命周期中使用单个OOS和OIS,并且不要在套接字上使用任何其他stream。
如果你想忘记你写的东西,使用ObjectOutputStream.reset().
并且不要在同一个套接字上使用任何其他stream或Readers
或Writers
。 对象streamAPI可以处理所有的Java原始数据types和所有的Serializable
类。
在使用Java 7/8时遇到类似的exception,我通过添加下面的VM参数来解决它
-Dsun.lang.ClassLoader.allowArraySyntax=true