2010-03-06 24 views
26

我的问题是当它试图读取的对象的第二时间,它引发异常:StreamCorruptedException:无效类型代码:AC

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()方法中为套接字创建输入和输出对象即可。对象声明在类的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(); 
     } 
    } 
} 

你是对的;我不关闭对象。我不知道该怎么做。

+0

我不知道在哪里关闭对象 – 2010-03-06 16:53:33

+0

NB你应该抓住EOFException类,而不是把它作为错误:不记录或打印堆栈跟踪;让它终止阅读循环。我不知道为什么你捕捉到UnknownHostException,你不能在相应的try块内抛出它。睡眠()实际上是浪费时间。去掉它。 – EJP 2014-09-08 22:47:32

回答

54

潜在的问题是,您正在使用新的ObjectOutputStream来写入现有的ObjectInputStream,您已经使用之前的ObjectOutputStream来写入。这些流具有由各自的构造函数写入和读取的标题,因此如果您创建另一个ObjectOutputStream,则将编写一个新的标题,该标题以 - 开始 - 猜测是什么? - 0xAC,和现有的ObjectInputStream在这一点上不期待另一个标题,所以它barf。

在@trashgod引用的Java论坛主题中,我应该忽略关于'重新为每个对象的两端'部分:这只是浪费。在套接字的生命周期中使用单个OOS和OIS,并且不要在套接字上使用任何其他流。

如果你想忘记你写什么,可以使用ObjectOutputStream.reset().

不要使用任何其他流或同一插座上ReadersWriters。对象流API可以处理所有的Java原始数据类型和所有的类。

+1

+1 @rookie:这是正确的答案,并从原始来源! :-) – trashgod 2010-03-07 16:52:51

+0

@EJP evrytime我运行代码创建了一个新的OOS和OIS。我如何管理? – 2012-07-03 11:19:31

+0

@AkhilKNambiar我不知道你在问我,上面还没有回答。 – EJP 2012-07-13 17:29:47

-1

同时使用Java 7/8面临着类似的例外,我解决它通过添加以下VM参数的

-Dsun.lang.ClassLoader.allowArraySyntax=true 
+0

'相似'不一样。这并不能解决OP发布的问题。 – EJP 2018-02-07 07:24:43

相关问题