簡體   English   中英

Netty編碼/解碼Java對象

[英]Netty Encoding/Decoding Java Object

我正在使用Netty 3.9。 我有一個簡單的客戶端服務器設置,可從http://en.wikipedia.org/wiki/Netty_%28software%29#Netty_TCP_Example獲得 我已經擴展了示例,以將Java搜索計划對象從客戶端發送到服務器

搜索計划對象是第三方對象,具有用於序列化和反序列化的方法。 序列化將對象寫入byte []數組。 我的客戶管道工廠看起來像這樣:

this.bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                    new StringDecoder(CharsetUtil.UTF_8),
                    new StringEncoder(CharsetUtil.UTF_8),
                    new DelimiterBasedFrameDecoder(
                            ALLOWED_CHARACTER_BUFFER_SIZE, Delimiters
                                    .lineDelimiter()),

                    /* We also add our Clients own ChannelHandler. */
                    new ClientChannelHandler());
        }
    });

我認為StringDecoder和StringEncoder不正確。 我想我需要某種我看不到的ByteEncoder / Decoder。 我需要寫這些嗎? 我嘗試將此代碼轉換為客戶端上的字符串

 byte[] byteVersion = searchPlanRepo.serialize(missionNum);  // serialize the search plan
 searchPlanStr = new String(byteVersion, StandardCharsets.UTF_8);

但是在服務器上無論我如何“反序列化”我失敗的對象。 我不斷收到錯誤消息:

“ java.lang.ClassCastException:java.lang.String無法轉換為payload.mission.SearchPlanType”

我的問題:

  1. 是否需要自定義字節編碼器/解碼器? 有沒有例子?
  2. 序列化似乎很簡單:從字節數組到字符串,但是從字符串反序列化到字節數組不起作用。 我確定我缺少什么。 誰能指出我正確的方向?

感謝您抽時間閱讀。 :)

菲爾

您可能會看一下序列化編解碼器:

http://netty.io/3.9/api/org/jboss/netty/handler/codec/serialization/package-summary.html

至於相關的例子:

https://github.com/netty/netty/tree/3.9/src/main/java/org/jboss/netty/example/objectecho

它們說明了如何序列化/反序列化對象。 當然,如果更具體,您也可以編寫自己的編解碼器。

我查看了示例ObjectDecoder和ObjectEncoder示例,這解決了我的問題。 我在客戶端上更改了流水線代碼,現在可以發出任務了。 這是來自客戶端/發送者的代碼:

this.bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                    new ObjectEncoder(),
                    new ObjectDecoder(ClassResolvers
                            .cacheDisabled(getClass().getClassLoader())),
                    new ClientChannelHandler());
        }
    });

服務器/接收器上的pipelineFactory代碼幾乎相同。 唯一的區別是每一側的處理程序。 客戶端使用ClientChannelHandler,它僅記錄來自服務器的消息。 服務器使用ServerChannelHandler,它執行接收到的任務並將其強制轉換為正確的Java類型,因此我可以對其進行操作。

暫無
暫無

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

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