一塊兒來學Netty - 序列化

在作 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.ObjectEncoderide

  • 實體類實現 java.io.Serializable序列化接口性能

1.建立 OrderRequest 與 OrderResponse兩個 Javaflex

  
    
  
  
   
   
            
   
   
  1. this

  2. 編碼

  3. spa

  4. .net

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 ..}
  
    
  
  
   
   
            
   
   
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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索