Если вы создаете несколько экземпляров ObjectInputStream последовательно для одного и того же потока ввода сокетов, это кажется плохой идеей. Если сервер записывает несколько объектов в один и тот же поток вывода, существует информация, связанная с сериализацией, которая отправляется только один раз для каждого уникального объекта, и только первый экземпляр ObjectInputStream на клиенте сможет надежно прочитать это. Использование только одного экземпляра ObjectInputStream для каждого входного потока сокета и одного экземпляра ObjectOutputStream для каждого выходного потока сокета, вероятно, является наиболее безопасной реализацией.
Кроме того, если вы записываете несколько объектов в один и тот же ObjectOutputStream экземпляр на стороне сервера (т. Е. Несколько вызовов writeObject ()), это может привести к проблемам заголовка потока из-за потенциально многократные ссылки на одни и те же объекты (обычно вложенные ссылки), когда они читаются входным потоком клиента
Эта проблема возникает, когда выходной поток объекта оборачивает выходной поток сокета, поскольку во время обычной сериализации вторая и последующие ссылки на объект не описывают объект, а скорее используют только ссылку. ObjectInputStream клиента не восстанавливает объекты должным образом по какой-то причине из-за разницы в информации заголовка, которую он ожидает (он не сохраняет ее от предыдущих вызовов readObject ()); похоже, это происходит только с потоками сокетов, а не с файловым вводом-выводом и т. д. Эта проблема возникает не при вызове first readObject (), а во втором и последующих.
Если вы хотите продолжать использовать один и тот же поток сокетов для записи нескольких объектов, вам потребуется что-то вроде следующего в коде сервера:
objectOut.reset()
objectOut.writeObject(foo);
Вызов reset () повторно инициализирует поток, игнорируя состояние любых объектов, ранее отправленных по потоку. Это гарантирует, что каждый объект отправляется полностью без ссылок типа дескриптора, которые обычно используются для сжатия данных ObjectOutputStream и предотвращения дублирования. Это менее эффективно, но не должно быть никакого повреждения данных при чтении клиентом.