Сериализация и неизменные объекты

У меня есть класс, который предназначается для неизменного использования, следовательно я хотел бы маркировать все поля final.

Однако класс сериализируется и десериализовывается для отправки по сети. Чтобы это работало, пустой конструктор требуется. Это предотвращает меня создающий заключительные поля.

Я уверен, что это - довольно типичная проблема, но я не могу найти решение. Как я должен продолжить двигаться?

17
задан Pool 2 November 2009 в 19:19
поделиться

4 ответа

В типичном случае сериализации не требуется, чтобы класс имел пустой конструктор или незавершенные поля для сериализации.

Теперь, если вам нужно выполнить собственную сериализацию, или вам нужно создать подкласс класса, который не реализует Serializable, это другая история.

Поэтому вам нужно предоставить более подробную информацию о том, как у вас возникла проблема.

7
ответ дан 30 November 2019 в 12:36
поделиться

Эта проблема связана с открытой ошибкой в ​​языке Java . (Обратите внимание, что это применимо только в том случае, если вам нужно выполнить сериализацию вручную, например, с помощью readObject)

5
ответ дан 30 November 2019 в 12:36
поделиться

Чтобы повторить сказанное, конструкторы no-arg не являются обязательными, если вы выбираете путь реализации интерфейса java.io.Serializable . Взгляните на исходный код java.lang.Integer , например, простой сериализуемый / неизменяемый класс, который имеет два конструктора: один принимает int, а другой - String. Исходный код: http://www.docjar.com/html/api/java/lang/Integer.java.html . Javadoc: http://java.sun.com/javase/6/docs/api/java/lang/Integer.html .

Также в зависимости от сложности вашего класса и того, что вы делаете , вы можете рассмотреть возможность реализации сериализации через интерфейс java.io.Externalizable (хотя некоторые считают его устаревшим, и для него ДЕЙСТВИТЕЛЬНО требуется конструктор без аргументов). Вот'

4
ответ дан 30 November 2019 в 12:36
поделиться

Конструктор без аргументов не требуется. Самый производный несериализуемый класс действительно нуждается в конструкторе без аргументов, доступном для наименее производного сериализуемого класса.

Если вам нужно изменить поля внутри readObject , то используйте последовательный прокси через readResolve и writeReplace .

9
ответ дан 30 November 2019 в 12:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: