在作
JAVA
開發的時候,接觸最多的就是java.io.Serializable
,經過該接口生成序列化ID,而後就能夠經過java.io.ObjectInput
與java.io.ObjectOutput
進行序列化與反序列化,無需考慮跨語言調用,對序列化性能要求不高的狀況,使用默認的是最方便的,雖然存在弊端,但也能知足大部分的須要....java
爲了更好的掌握 Netty
序列化相關知識,本章使用 Netty
給咱們提供的 ObjectEncoder
與 ObjectDecoder
對訂單請求與應答消息進行序列化操做...git
開發例程
在服務端
ChannelPipeline
新增解碼器io.netty.handler.codec.serialization.ObjectDecoder
微信在服務端
ChannelPipeline
新增解碼器io.netty.handler.codec.serialization.ObjectEncoder
ide實體類實現
java.io.Serializable
序列化接口性能
1.建立 OrderRequest
與 OrderResponse
兩個 Java
類flex
public class OrderRequest implements java.io.Serializable { private static final long serialVersionUID = 1826067782744144943L; private Integer orderId; private String userName; private String productName; private String phoneNumber; private String address; //省略 get set ..}
this
編碼
spa
.net
public class OrderResponse implements java.io.Serializable { private static final long serialVersionUID = -5003946216600820264L; private Integer orderId; private String respCode; private String desc;}
OrderServer
1.重寫 ChannelInitializer
中的 initChannel
方法,添加 ObjectDecoder
解碼器與 ObjectEncoder
編碼器
@Overrideprotected void initChannel(SocketChannel channel) throws Exception { channel.pipeline().addLast(new ObjectDecoder(1024 * 1024, ClassResolvers.weakCachingResolver(this.getClass().getClassLoader()))); channel.pipeline().addLast(new ObjectEncoder()); channel.pipeline().addLast(new OrderServerHandler());}
注意 ObjectDecoder(intmaxObjectSize,ClassResolverclassResolver)
,第一個參數是設置序列化對象的最大字節長度,若是超出限定範圍會拋出 StreamCorruptedException
,默認(1024 * 1024 = 1048576字節),第二個參數用於作 類解碼
操做
2.建立 OrderServerHandler
,而後將接收到的消息作過濾,知足條件回寫消息事件
private static class OrderServerHandler extends ChannelHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { OrderRequest request = (OrderRequest) msg; if ("Levin".equalsIgnoreCase(request.getUserName())) {//若是是Levin購買的,返回消息 System.out.println("Service Accept Client Order Request :[" + request.toString() + "]"); ctx.writeAndFlush(response(request.getOrderId())); } } private OrderResponse response(Integer orderId) { OrderResponse response = new OrderResponse(); response.setOrderId(orderId); response.setRespCode("200"); response.setDesc("下單成功"); return response; }}
OrderClient
1.建立 OrderClientHandler
,請求 3
次而後將數據寫入緩衝區後調用 flush
發送
private static class OrderClientHandler extends ChannelHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { for (int i = 1; i <= 3; i++) { ctx.write(request(i)); } ctx.flush(); } private Object request(int i) { OrderRequest request = new OrderRequest(); request.setAddress("上海市青浦區趙重公路1888號"); request.setOrderId(i); request.setPhoneNumber("130XXXX1912"); request.setProductName("一塊兒來學Netty"); request.setUserName("Levin"); return request; } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println("Receive Server Response :[" + msg + "]"); }}
試驗一把
分別啓動
OrderServer
和OrderClient
,將會看到以下日誌
綁定端口,同步等待成功......Service Accept Client Order Request :[OrderRequest{orderId=1, userName='Levin', productName='一塊兒來學Netty', phoneNumber='130XXXX1912', address='上海市青浦區趙重公路1888號'}]Service Accept Client Order Request :[OrderRequest{orderId=2, userName='Levin', productName='一塊兒來學Netty', phoneNumber='130XXXX1912', address='上海市青浦區趙重公路1888號'}]Service Accept Client Order Request :[OrderRequest{orderId=3, userName='Levin', productName='一塊兒來學Netty', phoneNumber='130XXXX1912', address='上海市青浦區趙重公路1888號'}]---------------------------------------------------------------------------------------------------------Receive Server Response :[OrderResponse{orderId=1, respCode='200', desc='下單成功'}]Receive Server Response :[OrderResponse{orderId=2, respCode='200', desc='下單成功'}]Receive Server Response :[OrderResponse{orderId=3, respCode='200', desc='下單成功'}]
總結
本章介紹瞭如何利用 Netty
提供的解碼器與編碼器實現對普通的對象進行序列化操做,經過訂單案例能夠發現 Netty
爲咱們作了不少事情,短短几行代碼就能完成序列化操做,咱們只需關注自身業務便可,極大的提升了開發效率....
- 說點什麼
微信公衆號: battcn
(歡迎調戲)
全文代碼:https://git.oschina.net/battcn/battcn-netty/tree/master/Chapter6-1/battcn-netty-6-1-1
我的QQ:1837307557
battcn開源羣(適合新手):391619659
本文分享自微信公衆號 - battcn(battcn)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。