【问题标题】:How to send Kryo serialized objects over JMS?如何通过 JMS 发送 Kryo 序列化对象?
【发布时间】:2016-07-16 07:48:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否检查过您的 JMS 提供程序是否允许您按原样发送对象?据我记得,几乎所有这些都允许您发送纯 Java 对象并将消息转换为“接收器”上的正确类型
  • 是的,我的 JMS 提供程序 (ActiveMQ) 可以发送 ObjectMessages。但我想用自定义序列化 (Kryo) 替换它以提高性能。

标签: java serialization jms kryo serialversionuid


【解决方案1】:

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

  • Performances :Kryo 第一次看到一个类时,它会生成一个 ID,并在序列化流中将该 ID 与该类的名称一起发送。下一次,Kryo 只发送 ID,不发送名称。如果类是显式注册的,则 ID 是已知的,并且 Kryo 永远不会发送类的名称:您在输出流中获得了一些字节
  • 一些“安全性”:如果您设置了“需要注册”标志,Kryo 将不会发送它不知道的课程。然后,您可以过滤通过网络发送的数据

但是,当您注册课程时,您必须在各处以相同的顺序注册完全相同的课程。这并不总是可能的。

在您的情况下,JMS 规范没有定义任何关于类的序列化的内容。这将取决于您使用的实现。如果你想要一些可移植的东西,你可以在应用层做到这一点:

  • 使用 Kryo 将您的类序列化为字节数组
  • 通过 JMS 使用 BytesMessage 发送此字节数组
  • 在您的 MessageListener 中使用 Kryo 反序列化消息

因为你可以控制谁序列化/反序列化,你可以在这里注册你使用的类,或者让 Kryo 自己生成 ID

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

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多