Netty序列化深入理解與使用
序列化與反序列化
序列化:把對(duì)象轉(zhuǎn)換成字節(jié)的過(guò)程,稱為對(duì)象序列化
反序列化:把字節(jié)恢復(fù)成對(duì)象的過(guò)程,稱為反序列化
- 對(duì)象的持久化概念:把字節(jié)保存的硬盤(pán)上永久的存放
- 網(wǎng)絡(luò)傳輸對(duì)象概念:客戶端將對(duì)象序列化為字節(jié)(序列化),變成二進(jìn)制的形式發(fā)送到服務(wù)器端端,服務(wù)器端接受到字節(jié)對(duì)象后,反序列化成對(duì)象
注意序列化的類必須要實(shí)現(xiàn) Serializable 接口, transient 修飾變量使得該變量不被序列化。
網(wǎng)絡(luò)傳輸過(guò)程中不能直接傳輸對(duì)象,TCP協(xié)議的底層是二進(jìn)制。

序列化模式
1.對(duì)象持久化概念:將對(duì)象轉(zhuǎn)換成字節(jié),存放到硬盤(pán)或者是數(shù)據(jù)庫(kù)中
2. 網(wǎng)絡(luò)傳輸對(duì)象概念:客戶端將對(duì)象轉(zhuǎn)成字節(jié)的形式(序列化)、變成二進(jìn)制的形式發(fā)送給服務(wù)器端,服務(wù)器端接受到字節(jié)之后,反序列化成對(duì)象(rpc 遠(yuǎn)程通訊)。
其他對(duì)象序列化方式
1、將對(duì)象轉(zhuǎn)換成json類型,實(shí)現(xiàn)跨語(yǔ)言
客戶端將對(duì)象轉(zhuǎn)換程json類型,傳遞給服務(wù)器端序列化。
服務(wù)器端獲取到j(luò)son, 在將json轉(zhuǎn)換成對(duì)象反序列化。
2、Xml類型
一般比較重量級(jí),一般只有銀行、保險(xiǎn)公司使用這種方式。
3、ProtoBuf(谷歌第三方協(xié)議,谷歌自定義協(xié)議)
4、MessagePack
也屬于json里面的
使用json協(xié)議實(shí)現(xiàn)對(duì)象的傳輸
就是將對(duì)象轉(zhuǎn)換成json字符串進(jìn)行傳輸。
MessagePack編碼器
它像JSON, 但是更快更小。
MessagePack是一種高效的二進(jìn)制序列化格式。它允許您在JSON等多種語(yǔ)之間交換數(shù)據(jù),但它更快速更小巧。小整數(shù)被編碼為單個(gè)字節(jié),典型的短字符串除了字符串本身之外只需要一個(gè)額外的字節(jié)。
支持Python、Ruby、 Java、 C/C++ 等眾多語(yǔ)言。宣稱比Google Protocol Buffers還要快4倍。。
使用案例:
引入mave依賴:
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>msgpack</artifactId>
<version>0.6.12</version>
</dependency>
基本api使用:
// 創(chuàng)建MessagePack MessagePack messagePack = new MessagePack(); MsgEntity meite = new MsgEntity(UUID.randomUUID().toString(), "kaico學(xué)習(xí)"); // 序列化 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 {
/**
* 對(duì)我們數(shù)據(jù)實(shí)現(xiàn)編碼
*
* @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> {
/**
* 服務(wù)器解碼數(shù)據(jù)
*
* @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));
}
}服務(wù)端使用
socketChannel.pipeline().addLast(new MsgpackDecoder()); socketChannel.pipeline().addLast(new ServerHandler());
客戶端使用
ch.pipeline().addLast(new MsgpackEncoder()); ch.pipeline().addLast(new ClientHandler());
到此這篇關(guān)于Netty序列化深入理解與使用的文章就介紹到這了,更多相關(guān)Netty序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中JDom解析XML_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
JDOM是一種解析XML的Java工具包。DOM適合于當(dāng)今流行的各種語(yǔ)言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等。下面通過(guò)本文給大家介紹Java中JDom解析XML的方法,感興趣的朋友一起學(xué)習(xí)吧2017-07-07
spring?MVC實(shí)現(xiàn)簡(jiǎn)單登錄功能
這篇文章主要為大家詳細(xì)介紹了spring?MVC實(shí)現(xiàn)簡(jiǎn)單登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
ZooKeeper框架教程Curator分布式鎖實(shí)現(xiàn)及源碼分析
本文是ZooKeeper入門(mén)系列教程,本篇為大家介紹zookeeper一個(gè)優(yōu)秀的框架Curator,提供了各種分布式協(xié)調(diào)的服務(wù),Curator中有著更為標(biāo)準(zhǔn)、規(guī)范的分布式鎖實(shí)現(xiàn)2022-01-01
Java JDK11基于嵌套的訪問(wèn)控制的實(shí)現(xiàn)
這篇文章主要介紹了Java JDK11基于嵌套的訪問(wèn)控制的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01

