Кэширование сериализации ObjectOutputStream с кодом ha sh по умолчанию - PullRequest
0 голосов
/ 07 апреля 2020

Я проверил ObjectOutput / InputStreams чуть ближе. Я хотел сохранить объекты на разных этапах, с изменяемым состоянием. Я быстро обнаружил, что только первый экземпляр был сериализован и записан в выходной поток. Я догадывался, что основной кеш построен на ха sh коде. Я переопределил hashCode() и equals(Object) методы. Получил этот замечательный ответ { ссылка }, даже если класс Foo переопределяет equals и методы hashCode не помогают при дифференцировании объектов. Мне также известно, что не рекомендуется использовать изменяемые поля для кода ha sh, но все же это можно сделать.

Кажется, ObjectOutputStream использует следующий метод http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/io/ObjectOutputStream.java#l2360, который получает значение по умолчанию ha sh ценность. Он отбрасывает переопределенный результат метода hashCode ().

Таким образом, теперь существует способ различать различные объекты во время записи, кроме вызова метода ObjectOutputStream.reset() или использования неизменяемых объектов, как описано здесь https://www.javaspecialists.eu/archive/Issue166.html.

У кого-нибудь есть подсказка, почему был реализован подход с использованием кода ha sh по умолчанию вместо переопределенного?

...