首頁 > 軟體

Netty序列化深入理解與使用

2022-08-01 14:00:27

序列化與反序列化

序列化:把物件轉換成位元組的過程,稱為物件序列化

反序列化:把位元組恢復成物件的過程,稱為反序列化

  • 物件的持久化概念:把位元組儲存的硬碟上永久的存放
  • 網路傳輸物件概念:使用者端將物件序列化為位元組(序列化),變成二進位制的形式傳送到伺服器端端,伺服器端接受到位元組物件後,反序列化成物件

注意序列化的類必須要實現 Serializable 介面, transient 修飾變數使得該變數不被序列化。

網路傳輸過程中不能直接傳輸物件,TCP協定的底層是二進位制。

序列化模式

1.物件持久化概念:將物件轉換成位元組,存放到硬碟或者是資料庫中

2. 網路傳輸物件概念:使用者端將物件轉成位元組的形式(序列化)、變成二進位制的形式傳送給伺服器端,伺服器端接受到位元組之後,反序列化成物件(rpc 遠端通訊)。

其他物件序列化方式

1、將物件轉換成json型別,實現跨語言

使用者端將物件轉換程json型別,傳遞給伺服器端序列化。

伺服器端獲取到json, 在將json轉換成物件反序列化。

2、Xml型別

一般比較重量級,一般只有銀行、保險公司使用這種方式。

3、ProtoBuf(谷歌第三方協定,谷歌自定義協定)

4、MessagePack

也屬於json裡面的

使用json協定實現物件的傳輸

就是將物件轉換成json字串進行傳輸。

MessagePack編碼器

它像JSON, 但是更快更小。

MessagePack是一種高效的二進位制序列化格式。它允許您在JSON等多種語之間交換資料,但它更快速更小巧。小整數被編碼為單個位元組,典型的短字串除了字串本身之外只需要一個額外的位元組。

支援Python、Ruby、 Java、 C/C++ 等眾多語言。宣稱比Google Protocol Buffers還要快4倍。。

使用案例:

引入mave依賴:

<dependency>
    <groupId>org.msgpack</groupId>
    <artifactId>msgpack</artifactId>
    <version>0.6.12</version>
</dependency>

基本api使用:

 // 建立MessagePack
MessagePack messagePack = new MessagePack();
MsgEntity meite = new MsgEntity(UUID.randomUUID().toString(), "kaico學習");
// 序列化
byte[] bs = messagePack.write(meite);
Value read1 = messagePack.read(bs);
System.out.println(read1);
// 反序列化
MsgEntity read = messagePack.read(bs, MsgEntity.class);
System.out.println(read);

在Netty框架中使用

編碼器

public class MsgpackEncoder extends MessageToByteEncoder {
    /**
     * 對我們資料實現編碼
     *
     * @param channelHandlerContext
     * @param msg
     * @param byteBuf
     * @throws Exception
     */
    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, Object msg, ByteBuf byteBuf) throws Exception {
        MessagePack msgpack = new MessagePack();
        byteBuf.writeBytes(msgpack.write(msg));
    }
}

解碼器

public class MsgpackDecoder extends MessageToMessageDecoder<ByteBuf> {
    /**
     * 伺服器解碼資料
     *
     * @param channelHandlerContext
     * @param byteBuf
     * @param list
     * @throws Exception
     */
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        final int length = byteBuf.readableBytes();
        byte[] b = new byte[length];
        byteBuf.getBytes(byteBuf.readerIndex(), b, 0, length);
        MessagePack msgpack = new MessagePack();
        list.add(msgpack.read(b));
    }
}

伺服器端使用

socketChannel.pipeline().addLast(new MsgpackDecoder());
socketChannel.pipeline().addLast(new ServerHandler());

使用者端使用

ch.pipeline().addLast(new MsgpackEncoder());
ch.pipeline().addLast(new ClientHandler());

到此這篇關於Netty序列化深入理解與使用的文章就介紹到這了,更多相關Netty序列化內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com