Почему компилятор Java создает синтетическое поле serialVersionUID? - PullRequest
10 голосов
/ 12 сентября 2011

Как часть отладки приложения, я заметил, что Field.getDeclaredFields() возвращает некоторые искусственные поля, включая поле serialVersionUID в классе, расширяющем интерфейс, хотя ни одно из них не расширяет Serializable.

Почему компилятор добавляет такие поля?

UPDATE

На самом деле, также создано синтетическое поле $VRc.

Ответы [ 2 ]

11 голосов
/ 12 сентября 2011

Компилятор / среда выполнения Java не будут автоматически создавать поле serialVersionUID. Я подозреваю, что вы используете некую форму структуры расширения байт-кода под капотом, которая инструктируется добавлять синтетические поля либо во время выполнения, либо во время компиляции.

Поле $VRc создается инструментарием Emma, ​​поэтому это может стать причиной хотя бы одного из синтетических полей.

Поле serialVersionUID также добавляется Эммой , когда для свойства instr.do_suid_compensation установлено значение true.

1 голос
/ 12 сентября 2011

Это поле необходимо для Java сериализация . Вкратце: он позволяет JVM обнаружить, что сериализованный класс (например, сохраненный на диске) впоследствии был изменен и не может быть безопасно десериализован обратно в объект.

Посмотрите на главу Управление версиями в приведенном выше документе, объясняется, как используется serialVersionUID.

ОБНОВЛЕНИЕ: только что заметил, что ваш класс не реализует Serializable. Вы уверены, что ни один из суперклассов или реализованных интерфейсов не расширяет Serializable?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...