Как отправить сериализованные объекты Kryo через JMS?

Я хотел бы использовать Kryo для (де-)сериализации объектов и отправки/получения их через JMS.

У меня проблема в том, что обе стороны, отправитель и получатель, должны зарегистрировать классы с одним и тем же идентификатором.

У Kryo есть метод register (Class type, int id), которым я пользуюсь. К сожалению, id — это int (по сравнению с long serialVersionUID, используемым интерфейсом Serializable). Было бы неплохо, если бы я мог использовать serialVersionUID для регистрации классов.

Как вы, ребята, используете Kryo по сети?


person Frizz    schedule 28.03.2016    source источник
comment
Вы проверили, позволяет ли ваш провайдер JMS отправлять объекты как есть? Насколько я помню, почти все они позволяют отправлять простые Java-объекты и приводить сообщение к нужному типу на получателе.   -  person x80486    schedule 29.03.2016
comment
Да, мой провайдер JMS (ActiveMQ) может отправлять ObjectMessages. Но я хотел бы заменить это пользовательской сериализацией (Kryo), чтобы повысить производительность.   -  person Frizz    schedule 29.03.2016


Ответы (1)


Вам не нужно явно регистрировать каждый класс, который вы хотите сериализовать с помощью Kryo. Основными преимуществами регистрации на курсы являются:

  • Выступления: Когда Kryo впервые видит класс, он генерирует идентификатор и отправляет этот идентификатор в сериализованном потоке с именем класса. В следующий раз Крио отправит только удостоверение личности, без имени. Если класс явно зарегистрирован, идентификатор уже известен, и Kryo никогда не отправляет имя класса: вы получаете несколько байтов в выходном потоке.
  • Некоторая «безопасность»: если вы установите флаги «требуется регистрация», Kryo не будет отправлять класс, о котором он не знал. Затем вы можете фильтровать данные, которые вы отправляете по сети.

Однако, когда вы регистрируете класс, вы должны везде регистрировать одни и те же классы в одном и том же порядке. Это не всегда возможно.

В вашем случае спецификация JMS ничего не определяет в отношении сериализации классов. Это будет зависеть от реализации, которую вы используете. Если вы хотите что-то портативное, вы можете сделать это на прикладном уровне:

  • Сериализуйте свои классы с Kryo в массив байтов
  • Отправьте этот массив байтов через JMS с BytesMessage.
  • В вашем MessageListener десериализуйте сообщение с помощью Kryo

Поскольку вы можете контролировать, кто сериализует/десериализует, вы можете зарегистрировать классы, которые вы используете здесь, или просто позволить Kryo самостоятельно сгенерировать идентификаторы.

ActiveMQ не поддерживает пользовательский хук сериализации. Вы не можете подключить свою собственную реализацию сериализации и поэтому не можете сказать ActiveMQ использовать Kryo при отправке ObjectMessage (см. ActiveMQObjectMessage). Вы должны использовать это BytesMessage. Возможно, другие поставщики JMS предоставляют такую ​​​​функцию (JMS - это просто спецификация API, она не определяет, как сообщения должны отправляться/сериализоваться, доступен только API)

person Jérémie B    schedule 31.03.2016