[英]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”
我的問題:
感謝您抽時間閱讀。 :)
菲爾
您可能會看一下序列化編解碼器:
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.