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

标签 java serialization jms kryo serialversionuid

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

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

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

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

最佳答案

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

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

但是,当你注册一个类(class)时,你必须在所有地方以相同的顺序注册完全相同的类(class)。这并不总是可能的。

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

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

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

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

关于java - 如何通过 JMS 发送 Kryo 序列化对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36272720/

相关文章:

java - 简单的 XML 反序列化

c# - Json 对象到 Model MVC

android - Android 的 ActiveMQ 和其他 FOSS JMS 实现

java - 为什么选择 JMS 作为异步解决方案?为什么它比简单的实体 bean 更好?

java - Camel 路由发布者未发布到 JMS 出站队列失败,并出现 java.util.concurrent.RejectedExecutionException

java - 如何从 Java 8 中的 LocalDateTime 获取毫秒数

java - 如何在 NetBeans 中删除/移动这行代码

java - 如何为 fragment 设置列表适配器

java - 如何从java中的mysql数据库获取图表数据?

java - jackson 为所有日期字段设置全局日期格式