Java序列化 - 分析不同序列化方式的优劣
1.序列化簡介
1.1 定義
序列化是將對象狀態轉換為可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換為對象。這兩個過程結合起來,可以輕松地存儲和傳輸數據
1.2 序列化的目的
通過序列化以字節流的形式使對象在網絡中進行傳遞和接收
永久性保存對象,保存對象的字節序列到本地文件或者數據庫中
通過序列化在進程間傳遞對象
深拷貝對象
跨語言傳遞數據
1.3 序列化常見的方式
是否跨語言:
生成的中間文件二進制流不同:
2.常見的序列化方式特點
2.1 JDK
參考腦圖
2.2 JSON
Jackson
相比json-lib框架,Jackson所依賴的jar包較少,簡單易用并且性能也要相對高些。 而且Jackson社區相對比較活躍,更新速度也比較快。 Jackson對于復雜類型的json轉換bean會出現問題,一些集合Map,List的轉換出現問題。 Jackson對于復雜類型的bean轉換Json,轉換的json格式不是標準的Json格式Gson
Gson是目前功能最全的Json解析神器,Gson當初是為因應Google公司內部需求而由Google自行研發而來, 但自從在2008年五月公開發布第一版后已被許多公司或用戶應用。 Gson的應用主要為toJson與fromJson兩個轉換函數,無依賴,不需要例外額外的jar,能夠直接跑在JDK上。 而在使用這種對象轉換之前需先創建好對象的類型以及其成員才能成功的將JSON字符串成功轉換成相對應的對象。 類里面只要有get和set方法,Gson完全可以將復雜類型的json到bean或bean到json的轉換,是JSON解析的神器。 Gson在功能上面無可挑剔,但是性能上面比FastJson有所差距。FastJson
Fastjson是一個Java語言編寫的高性能的JSON處理器,由阿里巴巴公司開發。 無依賴,不需要例外額外的jar,能夠直接跑在JDK上。 FastJson在復雜類型的Bean轉換Json上會出現一些問題,可能會出現引用的類型,導致Json轉換出錯,需要制定引用。 FastJson采用獨創的算法,將parse的速度提升到極致,超過所有json庫。京東:由于FastJSON安全漏洞,大促期間緊急上線(一般情況下大促是不允許上線的)
2.3 kryo
1.速度快,序列化后體積小 2.跨語言支持較復雜2.4 Protobuf
1.結構化數據存儲格式(xml,json等) 2.高性能編解碼技術 3.語言和平臺無關,擴展性好 4.支持java,C++,Python三種語言。2.5 hessian
1.默認支持跨語言 2.較慢2.6 Thrift
1.Thrift支持多種語言(C++,C#,Cocoa,Erlag,Haskell,java,Ocami,Perl,PHP,Python,Ruby,和SmallTalk) 2.Thrift適用了組建大型數據交換及存儲工具,對于大型系統中的內部數據傳輸,相對于Json和xml在性能上和傳輸大小上都有明顯的優勢。 3.Thrift支持三種比較典型的編碼方式。(通用二進制編碼,壓縮二進制編碼,優化的可選字段壓縮編解碼) 4.支持RPC2.7 fst
1.fst是完全兼容JDK序列化協議的系列化框架,序列化速度大概是JDK的4-10倍,大小是JDK大小的1/3左右。2.8 MsgPack
官網:https://msgpack.org redis中使用此標準 1.速度快 2.序列化手的數據占用空間小 3.中間轉換的是字符數組,不方便存儲到文件之中 4.性能不夠穩定(要求字段順序一致,刪減字段都需要注意)京東:一開始使用的MsgPack,添加字段通常不用Http,而是直接引jar包,在添加字段時,要加載最后,不能插在字段中間。多人添加字段時,合并分支誰也不知道誰先加的,字段又被頂上去了。造成過一些線上事故
2.9 Avro
hadoop研發序列化 支持RPC3 各大框架序列化方式
3.1 dobbo
通訊協議:dobbo協議,rmi協議,hessian協議,http協議,webservice協議 序列化方式:hessian,jdk,json,soap,kryo,fst,Protobuf(新版本支持),kryo3.2 springcloud
通訊協議:http 序列化方式:json3 性能測試
3.1 性能衡量指標
不同的序列化方式,本身設計就是滿足不同的應用場景,可序列化的數據類型,比如是否支持 StringBuffer和StringBuilder 等,所以單獨對比速度快慢,也不太合理,但大體上衡量標準可以參考如下
1.是否支持跨語言,支持語種是否豐富 2.編碼后的碼流 3.編解碼的性能 4.類庫是否小巧,API使用是否方便 5.使用者開發的工作量和難度。性能參考:
https://blog.csdn.net/Brady74/article/details/90983288?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
https://github.com/eishay/jvm-serializers
其中:JSON類庫,更適用于業務場景的開發,類的拷貝復制,不適合網絡傳輸,性能低于其他類別的序列化方式
其他的類庫,更傾向于中間件的設計,網絡傳輸
總結
以上是生活随笔為你收集整理的Java序列化 - 分析不同序列化方式的优劣的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带你理清 Java 混乱的日志体系 -
- 下一篇: 四面阿里,看看你都会吗