jms и разные версии перечислений

#java #serialization #enums #jms

#java #сериализация #перечисления #jms

Вопрос:

Моя команда предоставляет услугу другой команде в компании через jms. Это включает в себя перечисление, которое передается нам как часть более крупного объекта. Вскоре они изменят определение enum — однако я хотел бы сначала изменить его, чтобы я мог запустить наш сервис в производство за несколько дней до изменения. Изменение будет просто включать добавление другой константы в конце. Могу ли я сделать это безопасно?

Ответ №1:

Из спецификации сериализации объектов Java версии 6.0 (подчеркивания мои):

Сериализованная форма перечисляемой константы состоит исключительно из ее имени; […]. Чтобы сериализовать перечисляемую константу, ObjectOutputStream записывается значение, возвращаемое name методом перечисляемой константы. Чтобы десериализовать константу enum, ObjectInputStream считывает имя константы из потока; затем десериализованная константа получается вызовом метода java.lang.Enum.valueOf, передавая тип enum константы вместе с полученным именем константы в качестве аргументов.

Это означает, что:

  • Добавление нового значения к enum является обратно совместимым, когда дело доходит до сериализации
  • Изменение порядка существующих enum значений является обратно совместимым (в отличие от enum стратегии сохранения JPA по умолчанию, которая использует ordinal() )
  • Удаление значений из enum вообще не является обратно совместимым, поскольку удаленные значения, возможно, уже использовались для целей сериализации
  • Переименование enum значений не обратно совместимо (см. Выше)

Ответ №2:

Если я правильно понимаю, ваш объект, содержащий перечисление, отправляется как часть ObjectMessage. Если это так, то для кодирования и декодирования объекта enum использовалась обычная сериализация Java.

Сериализация для enums работает по имени — т.Е. Фактически они отправляют имя значения enum (вместе с идентификатором для его класса). Пока фактически отправленные значения существуют на другой принимающей стороне, проблем возникнуть не должно.

Конечно, вы должны убедиться, что значение сообщения не изменится из-за вашего изменения.

Комментарии:

1. И, конечно, Томаш отвечает за минуту до меня, через полчаса никто не отвечает. (Сначала мне пришлось загрузить спецификацию JMS для этого, чтобы посмотреть, действительно ли они используют сериализацию здесь. Они это делают, см. раздел 3.11.)