如何通过JMS发送Kryo序列化对象?

时间:2016-03-28 23:09:11

标签: java serialization jms kryo serialversionuid

我想使用Kryo来(取消)序列化对象并通过JMS发送/接收它们。

我遇到的问题是双方,发送方和接收方都必须使用相同的ID注册类。

Kryo有一个我使用的方法register (Class type, int id)。不幸的是,id是一个int(与Serializable接口使用的long serialVersionUID相比)。如果我可以使用serialVersionUID来注册类,那将是很好的。

你们如何通过网络使用Kryo?

1 个答案:

答案 0 :(得分:3)

您不必明确注册要使用Kryo序列化的每个类。注册课程的主要好处是:

  • 表演:Kryo第一次看到一个类,它会生成一个ID,并在序列化流中使用该类的名称发送此ID。接下来,Kryo只发送没有名字的ID。如果明确注册了类,则ID已知,并且Kryo永远不会发送类的名称:您在输出流中获得一些字节
  • 一些“安全”:如果您设置“需要注册”标志,Kryo将不会发送它不知道的类。然后,您可以过滤通过网络发送的数据

但是,当您注册一个类时,您必须在任何地方以相同的顺序注册完全相同的类。这并不总是可能的。

在您的情况下,JMS规范没有定义有关类的序列化的任何内容。这取决于您使用的实现。如果您想要可移植的东西,可以在应用程序层中执行此操作:

  • 使用Kryo将类序列化为字节数组
  • 使用BytesMessage
  • 通过JMS发送此字节数组
  • MessageListener使用Kryo
  • 反序列化邮件

由于您可以控制谁序列化/反序列化,您可以注册您在此处使用的类,或者让Kryo自己生成ID

ActiveMQ不支持自定义序列化挂钩。您无法插入自己的序列化实现,因此无法告诉ActiveMQ在发送ObjectMessage时使用Kryo(请参阅ActiveMQObjectMessage)。您必须使用此BytesMessage。也许其他JMS提供者提供这样的功能(JMS只是一个API规范,它没有定义如何发送/序列化消息,只有API可访问)