#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.)