Можно ли сериализовать объекты на основе значений, если приложение никогда не полагается на свою идентичность объекта?
Сонар показывает
Сделайте это поле на основе значений временным, чтобы оно не было включено в сериализацию этого класса.
Это ошибка на будущее, когда будет выпущен класс, основанный на значениях.
Итак, если приложение никогда не полагается на свою идентичность объекта, могу ли я сделать объекты на основе значений непереходными?
1 ответ
Чтобы сделать поле класса, основанного на значениях, непереходным, класс, основанный на значениях, должен быть сериализуемым. Так что на самом деле это дизайнерское решение, не принятое вами.
Если разработчик объявляет класс на основе значений и реализует Serializable
, они предполагают, что основанные на значениях классы и сериализация совместимы и останутся таковыми.
Мы не знаем, как будет выглядеть окончательная реализация типа значения, но следует использовать путь перехода, предлагаемый разработчиками JRE, например, при представлении неизменяемых списков, основанных на значениях и сериализуемых, вместо предположения о наличии дополнительных правила и ограничения за пределами спецификации.
В конце концов, нет оснований предполагать, что сериализация не будет работать с типами значений. Он также поддерживает примитивные значения и был адаптирован в прошлом, например, когда enum
поддержка была добавлена. Неясно, будет ли он всегда хранить значения тогда или по-прежнему поддерживать обратные ссылки, как с обычными объектами, или выполнять совершенно другую канонизацию, но до тех пор, пока вы не полагаетесь на идентичность объекта, как это было сделано, вы находитесь на безопасная сторона, так как любая стратегия будет работать с вашим кодом.