序列化:將對象狀態轉換為可保持或傳輸的二進制。
反序列化:將二進制數據轉換為對象的過程。
常見的序列化方式:
后續代碼示例會加上。
1.JDK原生序列化:
- 安全性較差。
2.JSON:
- JSON 是典型的 Key-Value 方式,沒有數據類型,是一種文本型序列化框架
- JSON 進行序列化的額外空間開銷比較大,對於大數據量服務這意味着需要巨大的內存和磁盤開銷;JSON 沒有類型,但像 Java 這種強類型語言,需要通過反射統一解決,所以性能不會太好。所以如果 RPC 框架選用 JSON 序列化,服務提供者與服務調用者之間傳輸的數據量要相對較小,否則將嚴重影響性能。
3.XML:
- 文本類序列化方式
- 序列化的額外空間開銷比較大
4.Hessian:
- Hessian 是動態類型、二進制、緊湊的,並且可跨語言移植的一種序列化框架。Hessian 協議要比 JDK、JSON 更加緊湊,性能上要比 JDK、JSON 序列化高效很多,而且生成的字節數也更小。
- 相對於 JDK、JSON,由於 Hessian 更加高效,生成的字節數更小,有非常好的兼容性和穩定性,所以 Hessian 更加適合作為 RPC 框架遠程通信的序列化協議。
5.Protobuf:
- Protobuf 是 Google 公司內部的混合語言數據標准,是一種輕便、高效的結構化數據存儲格式,可以用於結構化數據序列化,支持 Java、Python、C++、Go 等語言。Protobuf 使用的時候需要定義 IDL(Interface description language),然后使用不同語言的 IDL 編譯器,生成序列化工具類,
- 優點:序列化后體積相比 JSON、Hessian 小很多;IDL 能清晰地描述語義,所以足以幫助並保證應用程序之間的類型不會丟失,無需類似 XML 解析器;序列化反序列化速度很快,不需要通過反射獲取類型;消息格式升級和兼容性不錯,可以做到向后兼容。
6.Thrift:
- Thrift是Facebook開源提供的一個高性能,輕量級RPC服務框架,其產生正是為了滿足當前大數據量、分布式、跨語言、跨平台數據通訊的需求。 但是,Thrift並不僅僅是序列化協議,而是一個RPC框架。 相對於JSON和XML而言,Thrift在空間開銷和解析性能上有了比較大的提升,對於對性能要求比較高的分布式系統,它是一個優秀的RPC解決方案;但是由於Thrift的序列化被嵌入到Thrift框架里面, Thrift框架本身並沒有透出序列化和反序列化接口,這導致其很難和其他傳輸層協議共同使用(例如HTTP)。
RPC框架如何選擇序列化方式?
優先級:安全性--通用性--兼容性--性能--效率--空間開銷
在RPC框架中,構造入參,返回值需要注意以下幾點
- 對象要盡量簡單,沒有太多的依賴關系,屬性不要太多,盡量高內聚;
- 入參對象與返回值對象體積不要太大,更不要傳太大的集合;
- 盡量使用簡單的、常用的、開發語言原生的對象,尤其是集合類;
- 對象不要有復雜的繼承關系,最好不要有父子類的情況。