什么時候需要序列化?
當你程式里的物件要存盤到硬碟或者通過網路傳輸的時候,你的物件就需要序列化成二進制位元組陣列,那么,序列化對我們的程式到底有多大影響,如何判斷一個序列化框架的好壞?我們一般從如下幾個方面來評定一個序列化框架的優劣,
1、序列化反序列化的速度->直接影響了程式的性能,
2、序列化后位元組流的大小->可能會占據你更多的帶寬,特別是外網帶寬很貴,
3、是否跨平臺跨語言->影響了你程式的拓展性,
接下來介紹一下我常用的三種序列化方式,
一、Jdk序列化
Jdk序列化是最先接觸的序列化方式,一個物件需要序列化,需要實作Serializable介面,并改寫serialVersionUID欄位值,
它會將類的資訊和狀態資訊一起序列化到一個二進制陣列里,保存到磁盤或者通過網路傳輸,當我們從磁盤或者網路收到這個二進制陣列時,就可以通過這個資料進行反序列化來還原我們程式中的物件,但是這個序列化方式有如下缺點,一般不建議使用:
1、序列化反序列化的性能較長,會導致程式性能變慢,
2、序列化產生的碼流較大,會占用更多的磁盤和帶寬,
3、只能在Java里使用,不能跨語言使用,
二、Json序列化
在Json序列化之前,我們還用過xml的方式來保存資料,json相比xml,精簡了不少,從xml的標簽對改為了json了欄位名,也不用進行繁重的dom決議,現在的xml我們常見的是一些組態檔采用了這個格式,
Json序列化是目前我作業中用到最主要的序列化方式,不管是Http的呼叫,還是快取資料的序列化,90%以上都是用這個,有一批優秀的Json序列化框架,如FastJson、Jackson等,
三、ProtoBuf序列化
ProtoBuf序列化是公認的最好的序列化框架之一,具有極佳的序列化反序列化速度和極小的碼流,非常適合追求極致性能的應用程式,
1、這么優秀的原因:
把資料變小一點,對于一條資料,json的表示方法:
{ "age": 30, "name": "zhangsan", "height": 175.33, "weight": 140 }
protobuf省去了很多中間冗余的{}"":,等,同時傳輸的程序中省略了null值
采用tag技術,替代json的key/value,使用tag的話,一般只占用1個位元組,而json的key一個字符就占1個位元組
在傳輸的程序中,會對整數進行壓縮,例如一個long型別的1,會壓縮成byte型別的1,這些是在內部操作的,對開發而言,是透明的
protobuf是采用tag/leg/value的方式來保存資料的,讀到某個欄位(tag)后,直接獲取長度leg,決議出來就是所需要的值,而json需要決議字串才可以辦到,
2、如何使用:
引入依賴:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.5.1</version>
<scope>compile</scope>
</dependency>
撰寫proto檔案
syntax = "proto3";
option java_package = "chen.huai.jie.sdn.message.proto";
message StoreContent {
string topic =1;
string key =2;
bytes message=3;
}
匯入protoc.exe可執行檔案
利用命令來生成proto對應的java檔案
protoc --java_out=..\java --proto_path=. *.proto
最終生了我們java里需要用到的檔案,每次改動proto檔案后都需要重新生成,
接下來我們就可以在代碼里利用proto快樂的玩耍了,
關于protobuf的性能,可以參考我另一篇博客,里面有對json和protobuf的序列化性能對比
Java專案的快取方案_ChenHuaiJie0912的博客-CSDN博客_java快取方案
總結:
不是說沒有其他的序列化方式,只是我對這三種用的最多,其他的用過了我也會在這里繼續補充,極致性能體驗推薦使用protobuf,真的不錯,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/386803.html
標籤:其他
上一篇:周總結(12.13-12.19)
