【问题标题】:Android: OptionalDataException upon ObjectInputStream.readObject()Android:ObjectInputStream.readObject() 上的 OptionalDataException
【发布时间】:2014-02-19 11:18:27
【问题描述】:

情况:从我的 Android 服务器,我正在向客户端发送一个简单的 String OBJECT。我在服务器使用 ObjectOutputStream,在客户端使用 ObjectInputStream。

服务器代码:

            mOutput.flush();
            mOutput.reset();

            Object myStr = new String(res); //res is some String
            mOutput.writeObject(myStr);
            mOutput.flush();

客户代码:

            Log.v("CLIENT","Attempting to receive results from Server");

            obj = objectInputStream.readObject(); //ERROR THROWN HERE

            Log.v("CLIENT", "Object received");

            res = (String)obj;

问题:在客户端,我在 readObject() 期间收到 OptionalDataException。有趣的是,它只能在第一次正确读取它,但随后会抛出此异常。

如您所见,我在发送对象之前和之后刷新()和重置() OutPutStream。为什么还会出现这个错误?

【问题讨论】:

  • 编辑了我的代码。我尝试发送一个字符串对象,一个内部带有字符串的纯对象,但发生了同样的错误。

标签: android objectinputstream objectoutputstream optionaldataexception


【解决方案1】:

问题解决了。 Android 的文档说,在发送对象时,ObjectOutputStream 中不应有剩余的原语。

事实证明,我在发送对象后也在写一个字节(使用writeBytes())。 flush()reset() 没有删除ObjectOutputStream 中的这个杂散字节,因此ObjectInputStream 报告了OptionalDataException

确保在阅读 ObjectInputStream 之前还删除了任何杂散的 ObjectOutputStream.writeInt()writeBoolean(), writeUTF()writeChars() 或任何内容...否则将引发此异常!

想知道为什么之前的和立即的 flush()reset() 不起作用?

【讨论】:

  • 您不必删除它们。你只需要确保你真的阅读了它们。否则,首先写它们的目的到底是什么? flush()reset() 完全没有理由应该甚至可以为你处理这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多