Ответ 1
классической причиной этой проблемы является отправка одной и той же ссылки объекта несколько раз. поток Object impls сохраняет идентификатор ссылки объекта, а на принимающей стороне вы получите тот же объект обратно на каждый вызов readObject() (даже если вы изменили объект на стороне отправки!). ваш псевдокод корректен, однако вопрос в том, правильно ли он отражает ваш фактический код.
если ваша проблема является справочной проблемой, вы можете решить проблему путем отправки разных экземпляров объекта каждый раз или с помощью writeUnshared()
и/или вызова reset()
между каждым вызовом writeObject()
. использование writeUnshared()
заставит основной объект быть экземпляром нового объекта на принимающей стороне, но другие объекты, на которые может ссылаться этот объект, могут по-прежнему являться общими ссылками. с другой стороны, вызов reset()
приведет к очистке всех кэшированных объектов на принимающей стороне, поэтому все ссылки на объекты на принимающей стороне будут новыми ссылками. который лучше всего управляет данными по проводу, зависит от вашего использования, но для долговременных потоков всегда полезно периодически вызывать reset()
, так как это освободит память, которая со временем будет нарастать (это является обычной, но тонкой "утечкой памяти" при использовании потоков объектов).