编程语言
首页 > 编程语言> > java-如何通过JMS发送Kryo序列化对象?

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

作者:互联网

我想使用Kryo对对象进行反序列化,并通过JMS发送/接收它们.

我遇到的问题是,发送方和接收方双方必须注册具有相同ID的类.

Kryo有一个我使用的方法寄存器(类类型,整数ID).不幸的是,id是一个int(与Serializable接口使用的long serialVersionUID相比).如果我可以使用serialVersionUID来注册类,那就太好了.

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

解决方法:

您不必明确注册要使用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)

标签:serialization,jms,serialversionuid,kryo,java
来源: https://codeday.me/bug/20191118/2031560.html