我們為什么要序列化
舉個栗子:下雨天我們要打傘,但是之后我們要把傘折疊起來,方便我們存放。那么運用到我們java中道理是一樣的,我們要將數據分解成字節流,以便存儲在文件中或在網絡上傳輸,這叫序列化。我們要用的時候,就需要將字節流重構成對象,這叫反序列化。不知道我這么說大家能不能理解。
java序列化的缺點
java自己提供序列化而且用起來也非常簡單,但是在遠程服務調用中很少用它,主要存在以下缺點:
-
1.無法跨語言。這應該是
java序列化最致命的問題了。由於
java序列化是
java內部私有的協議,其他語言不支持,導致別的語言無法反序列化,這嚴重阻礙了它的應用。
-
2.序列后的碼流太大。
java序列化的大小是二進制編碼的5倍多!
-
3.序列化性能太低。
java序列化的性能只有二進制編碼的6
.17倍,可見
java序列化性能實在太差了。
總結 我們判斷一個編碼框架的優劣主要從以下幾個方面:
1.是否支持跨語言,支持語種是否豐富
2.編碼后的碼流
3.編解碼的性能
4.類庫是否小巧,API使用是否方便
5.使用者開發的工作量和難度。
幾個流行的編解碼框架
1.google的Protobuf
Protobuf是google開源的項目,全稱 Google Protocol Buffers.特點:
1.結構化數據存儲格式(xml,json等)
2.高性能編解碼技術
3.語言和平台無關,擴展性好
4.支持java,C++,Python三種語言。
2.faceBook的Thrift
Thrift源於faceBook,2007年facebook將Thrift做為一個開源項目交給了apache基金會。特點:
-
1
.Thrift支持多種語言(
C++,
C#,
Cocoa,
Erlag,
Haskell,
java,
Ocami,
Perl,
PHP,
Python,
Ruby,和
SmallTalk)
-
2
.Thrift適用了組建大型數據交換及存儲工具,對於大型系統中的內部數據傳輸,相對於
Json和
xml在性能上和傳輸大小上都有明顯的優勢。
-
3
.Thrift支持三種比較典型的編碼方式。(通用二進制編碼,壓縮二進制編碼,優化的可選字段壓縮編解碼)
3.kryo
官方文檔中文翻譯:http://blog.csdn.net/fanjunjaden/article/details/72823866
1.速度快,序列化后體積小
2.跨語言支持較復雜
4.hessian
1.默認支持跨語言
2.較慢
5.fst
高性能序列化框架FST:http://liuyieyer.iteye.com/blog/2136240
1.fst是完全兼容JDK序列化協議的系列化框架,序列化速度大概是JDK的4-10倍,大小是JDK大小的1/3左右。
6.序列化成json
各個JSON技術的比較詳解:http://developer.51cto.com/art/201506/480273.htm
6.1、開源的Jackson
-
相比json-lib框架,Jackson所依賴的jar包較少,簡單易用並且性能也要相對高些。
-
而且Jackson社區相對比較活躍,更新速度也比較快。
-
Jackson對於復雜類型的json轉換bean會出現問題,一些集合
Map,List的轉換出現問題。
-
Jackson對於復雜類型的bean轉換Json,轉換的json格式不是標准的Json格式
6.2、Google的Gson
-
Gson是目前功能最全的Json解析神器,Gson當初是為因應Google公司內部需求而由Google自行研發而來,
-
但自從在2008年五月公開發布第一版后已被許多公司或用戶應用。
-
Gson的應用主要為toJson與fromJson兩個轉換函數,無依賴,不需要例外額外的jar,能夠直接跑在JDK上。
-
而在使用這種對象轉換之前需先創建好對象的類型以及其成員才能成功的將JSON字符串成功轉換成相對應的對象。
-
類里面只要有get和
set方法,Gson完全可以將復雜類型的
json到bean或bean到
json的轉換,是
JSON解析的神器。
-
Gson在功能上面無可挑剔,但是性能上面比FastJson有所差距。
6.3、阿里巴巴的FastJson
-
Fastjson是一個Java語言編寫的高性能的JSON處理器,由阿里巴巴公司開發。
-
無依賴,不需要例外額外的jar,能夠直接跑在JDK上。
-
FastJson在復雜類型的Bean轉換Json上會出現一些問題,可能會出現引用的類型,導致Json轉換出錯,需要制定引用。
-
FastJson采用獨創的算法,將parse的速度提升到極致,超過所有json庫。
綜上4種Json技術的比較,在項目選型的時候可以使用Google的Gson和阿里巴巴的FastJson兩種並行使用,
如果只是功能要求,沒有性能要求,可以使用google的Gson,
如果有性能上面的要求可以使用Gson將bean轉換json確保數據的正確,使用FastJson將Json轉換Bean。
以上所有框架性能測試數據結果:http://developer.51cto.com/art/201506/480273.htm
