2013-08-21 4 views
1

от Javadoc of ObjectInputStream:Сериализация перечислений полей в Java

константы Enum десериализации иначе, чем обычные сериализуемых или Externalizable объектов. Сериализованная форма константы перечисления состоит исключительно из ее названия; значения поля константы не передаются . Для десериализации константы перечисления ObjectInputStream считывает имя константы из потока; десериализованная константа затем равна , полученной путем вызова статического метода Enum.valueOf (класс, строка) с базовым типом константы перечисления и полученным именем константы как аргументов. Как и другие сериализуемые или внешние объекты, константы enum могут функционировать в качестве целей обратных ссылок, появляющихся впоследствии в потоке сериализации. Процесс, с помощью которого enum константы десериализуются, не может быть изменен: любые методы класса readObject, readObjectNoData и readResolve, определенные типами перечислений , игнорируются во время десериализации. Аналогичным образом, любые последовательные поля с полями или идентификаторы поля serialVersionUID также игнорируются - - все типы перечислений имеют фиксированный serialVersionUID 0L.

Почему перечисления на Java не сериализованы целиком? Перечисления на Java - это больше, чем просто константы, и являются полноценными классами, которые также могут содержать состояние. Не приводит ли это к несогласованному состоянию между отправляющим и принимающим концами? Что это за фундаментальный момент, который мне не хватает здесь?

+0

* Перечисления на Java - это полноценные классы, которые также могут содержать состояние? * Java 'enum' может содержать состояние и в зависимости от того, как вы его создаете, вы можете изменить его состояние, обратите внимание, что, конечно, изменение состояния' enum' не является хорошей практикой. –

ответ

6

Урок состоит в том, чтобы не использовать перечисления, когда вам нужны изменяемые объекты. Да, вы можете создавать перечисления, которые поддерживают внутреннее состояние, но они не предназначены для этого. Как и в случае сериализации, не все части Java будут взаимодействовать, если вы это сделаете.

Если вы хотите привязать значения enum к данным состояния, используйте EnumMap. Этот класс реализует Serializable, поэтому вам не нужно будет выполнять какую-либо дополнительную работу по сериализации данных состояния (если сами объекты данных сами по себе являются сериализуемыми).