Netty编码/解码Java对象

Netty编码/解码Java对象,java,serialization,netty,Java,Serialization,Netty,我正在使用Netty 3.9。我有一个简单的客户机服务器设置,我从。我扩展了这个示例,将Java搜索计划对象从客户端发送到服务器 搜索计划对象是具有序列化和反序列化方法的第三方对象。序列化将对象写入字节[]数组。我的客户端管道工厂如下所示: this.bootstrap.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() t

我正在使用Netty 3.9。我有一个简单的客户机服务器设置,我从。我扩展了这个示例,将Java搜索计划对象从客户端发送到服务器

搜索计划对象是具有序列化和反序列化方法的第三方对象。序列化将对象写入字节[]数组。我的客户端管道工厂如下所示:

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/解码器。我需要写这些吗?我尝试在客户端将此代码转换为字符串

 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”

我的问题是:

  • 我需要自定义字节编码器/解码器吗?有什么例子吗
  • 序列化似乎很简单:从字节数组到字符串,但从字符串到字节数组的反序列化不起作用。我肯定我错过了什么。有人能给我指出正确的方向吗
  • 感谢您抽出时间阅读本文。:)


    Phil

    您可以查看序列化编解码器:

    关于相关示例:


    它们说明了如何序列化/反序列化对象。当然,如果更具体,您也可以编写自己的编解码器。

    我查看了示例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类型,以便我可以操作它