Как гарантировать непротиворечивость перечислений в сериализации Java?

Когда я сериализирую объект, я могу использовать serialVersionUID механизм на уровне класса для обеспечения совместимости двух типов.

Однако, что происходит, когда я сериализирую поля перечислимых значений? Существует ли способ гарантировать, что перечислимым типом не управляли между сериализацией и десериализацией?

Предположим, что у меня есть перечисление как OperationResult {УСПЕХ, СБОЙ}, и поле, названное "результатом" в объекте, который сериализируется. Как я удостоверяюсь, когда объект десериализовывается, тот результат все еще корректен, даже если кто-то злонамеренно инвертировал два? (Предположим, что перечисление объявляется в другом месте как статическое перечисление),

Я задаюсь вопросом из любопытства - я использую аутентификацию уровня банки для предотвращения управления.

16
задан Uri 16 June 2010 в 22:54
поделиться

2 ответа

От: http://www.theserverside.com/news/thread.tss?thread_id=50190#265205

Разработчики функции enum решили нет варианта использования для создания нового перечислить объекты во время выполнения. Они взяли большая осторожность, чтобы не допустить этого.

Следовательно, похоже, что объекты перечисления не могут быть сериализованы и десериализованы полностью. Кроме того, из http://java.sun.com/javase/6/docs/platform/serialization/spec/serial-arch.html#6469 :

Константы перечисления сериализованы отличается от обычного сериализуемого или внешние объекты. В сериализованная форма константы перечисления состоит исключительно из его названия; поле значения константы отсутствуют в виде. Чтобы сериализовать перечисление константа, ObjectOutputStream пишет значение, возвращаемое перечислением метод имени константы. Десериализовать константа перечисления, ObjectInputStream читает имя константы из транслировать; десериализованная константа затем получается путем вызова java.lang.Enum.valueOf, передавая тип перечисления константы вместе с полученное имя константы как аргументы. Как и другие сериализуемые или внешние объекты, константы перечисления могут выступать в качестве целей спины ссылки, появляющиеся впоследствии в поток сериализации.

Процесс, с помощью которого константы перечисления сериализованы не могут быть настроены: любой специфичный для класса writeObject, readObject, readObjectNoData, методы writeReplace и readResolve определенные перечисляемыми типами игнорируются во время сериализации и десериализация. Аналогично любой serialPersistentFields или Объявления поля serialVersionUID также игнорируются - все типы перечислений имеют фиксированный serialVersionUID 0L. Документирование сериализуемых полей и данные для перечисляемых типов не нужны, поскольку нет изменений в тип отправленных данных.

22
ответ дан 30 November 2019 в 21:18
поделиться

Перечисления читаются-заменяются во время десериализации. Цитата из примечаний к выпуску сериализации для версии 1.5:

Правила сериализации перечисления экземпляры отличаются от тех, для сериализация "обычного" сериализуемого объект: сериализованная форма перечисления экземпляр состоит только из его перечисления постоянное имя вместе с информацией идентифицирующий его базовый тип перечисления. Поведение десериализации отличается: хорошо - информация о классе используется для найти соответствующий класс перечисления и метод Enum.valueOf вызывается с этот класс и полученная константа имя для получения перечисления константа для возврата.

5
ответ дан 30 November 2019 в 21:18
поделиться
Другие вопросы по тегам:

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