2015-07-15 4 views
8

Я анализирую проект Java SE 7 от SonarQube версии 5.1.Должно ли поле enum быть Serializable?

Затем я столкнулся с squid:S1948 по нижнему коду.

Поля в «Serializable» класса должны быть либо временными или сериализации

поля в Serializable класса сами должны быть Serializable или переходный, даже если класс никогда не явно сериализованная или десериализации. Это связано с тем, что при загрузке большинство фреймворков приложений J2EE сбрасывают объекты на диск и предположительно объект Serializable с непереходными, несериализуемыми элементами данных может привести к сбоям в работе программы и открыть дверь злоумышленникам.

enum ShutterSpeed { 
    private final Rational value; // Make "value" transient or serializable. 
    ... 
} 

Я думаю, что любое перечисления поле не будет упорядочен в J2SE 5.0 (Serialization of Enum Constants)

Является ли это ложно-положительным?

Весь код и выпуск here.

ответ

7

Это на самом деле ложноположительный. Serialization of Enum Constants (который вы предоставили ссылку) говорит, что:

Enum константы сериализируются иначе, чем обычные сериализуемых или Externalizable объектов. Сериализованная форма константы перечисления состоит исключительно из ее названия; значения поля константы не равны , которые представлены в форме.

Как я понимаю, это не имеет смысла, чтобы отметить Enum «s значения полей transient или сделать их реализации Serializable, так как они никогда не получить сериализации, независимо от того, если они помечены как transient или реализовать Serializable.

Если этот инструмент анализа заставляет вас выполнить одно из этих двух действий, тогда вы будете писать бесполезный код. Если бы я был вами, я бы попытался отключить это предупреждение для enum s.

0

Я бы просто отметил поле как переходное.

Смежные вопросы