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