簡體   English   中英

如何通過JMS發送Kryo序列化對象?

[英]How to send Kryo serialized objects over JMS?

我想使用Kryo來(去)序列化對象並通過JMS發送/接收它們。

我遇到的問題是雙方,發送方和接收方都必須使用相同的ID注冊類。

Kryo有一個我使用的方法register (Class type, int 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可訪問)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM