2016-03-28 5 views
3

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

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

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

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

+0

Вы проверили, позволяет ли ваш поставщик JMS отправлять объекты в виде as- является? Насколько я помню, почти все они позволят вам отправлять простые Java-объекты и передавать сообщение в нужный тип на «приемнике» –

+0

Да, мой JMS-провайдер (ActiveMQ) может отправлять объекты ObjectMessages. Но я хотел бы заменить это с помощью пользовательской сериализации (Kryo), чтобы быть более совершенным. – Frizz

ответ

3

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

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

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

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

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

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

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

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