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 ()? Я даже распечатал объект message, который принимается строкой ниже, и он точно такой же, как в первом экземпляре, где все работает нормально.
Objectbuf= myInput.readObject();
Я предполагаю, что есть какая-то проблема с добавлением, но мне действительно нет смысла добавлять. Я просто хочу каждый раз читать новую строку. Я был бы очень признателен за помощь в исправлении этой ошибки. Спасибо.
==================================
Перед этой строкой я просто создаю объекты ввода и вывода для сокета в методе run() . Объявление объекта находится вне метода run () в классе:-
try { //Creating input and output streams to transfer messages to the server myOutput = newObjectOutputStream(skt.getOutputStream()); myInput = newObjectInputStream(skt.getInputStream()); while (true) { buf = myInput.readObject(); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { } catch (Exception e) { e.printStackTrace(); } } }
Вы правы; я не закрываю объект. Я не уверен, как это сделать.
Переведено автоматически
Ответ 1
Основная проблема заключается в том, что вы используете new ObjectOutputStream для записи в поток, для записи в который вы уже использовали предыдущий ObjectOutputStream. Эти потоки имеют заголовки, которые записываются и считываются соответствующими конструкторами, поэтому, если вы создадите другой, ObjectOutputStream вы напишете новый заголовок, который начинается с - угадайте, что? - 0xAC, и существующий ObjectInputStream на данный момент не ожидает другого заголовка, поэтому его вырывает.
В ветке форумов Java, на которую ссылается @trashgod, я должен был опустить часть о "заново для каждого объекта на обоих концах": это просто расточительно. Используйте один OOS и OIS в течение срока службы сокета и не используйте никакие другие потоки в сокете.
Если вы хотите забыть то, что вы написали, используйте ObjectOutputStream.reset().
И не используйте никакие другие потоки или Readers или Writers в том же сокете. API object stream могут обрабатывать все примитивные типы данных Java и все Serializable классы.