byte[]
。
指標
|
說明
|
重要性
|
通用性
|
是否跨平臺,社區如何
|
中高
|
可讀
|
序列化格式是否可讀
|
中低
|
易用性
|
是否簡單易用
|
中高
|
性能
|
序列化後的大小和壓縮 CPU消耗
|
中高
|
可擴展性
|
是在容許字段修改
|
高
|
安全性
|
是否存在一些沒法修復的漏洞
|
高
|
hessian
、
JSON
、
XML
等。
package com.sofa.test.Person;
public class Person {
private int age = 15;
private String name = 「sofa」;
}
複製代碼
hessian
序列化後的字節流以下:
M**com.sofa.test.PersonS**nameS**sofaS**ageI**b3 b2 b1 b0 z
Protobuf
以及
thrift
等等。在使用時都須要事先定義一箇中間格式的文件(IDL 文件),而後根據不一樣語言的生成工具生成一個相應語言的可序列化類。如下是一個簡單的 Proto的描述文件
message SofaApp{
string appName = 1;
repeated string authList = 2;
repeated string serviceList = 3;
}
複製代碼
hessian
、
Protobuf
、
Json
。
hessian
和
Protobuf
。兩個序列化實現類繼承了
AbstractSerializer
抽象類,該抽象類又實現了以下的
Serializer
接口:
/**
* 序列化器接口
*
* @author <a href=mailto:zhanggeng.zg@antfin.com>GengZhang</a>
*/
@Extensible(coded = true)
@Unstable
public interface Serializer {
/**
* 序列化
*
* @param object 對象
* @param context 上下文
* @return 序列化後的對象
* @throws SofaRpcException 序列化異常
*/
public AbstractByteBuf encode(Object object, Map<String, String> context) throws SofaRpcException;
/**
* 反序列化,只有類型,返回對象
*
* @param data 原始字節數組
* @param clazz 指望的類型
* @param context 上下文
* @return 反序列化後的對象
* @throws SofaRpcException 序列化異常
*/
public Object decode(AbstractByteBuf data, Class clazz, Map<String, String> context) throws SofaRpcException;
/**
* 反序列化,已有數據,填充字段
*
* @param data 原始字節數組
* @param template 模板對象
* @param context 上下文
* @throws SofaRpcException 序列化異常
*/
public void decode(AbstractByteBuf data, Object template, Map<String, String> context) throws SofaRpcException;
}
複製代碼
SerializerFactory
序列化工廠傳入序列化名稱獲取,獲取到的序列化協議對象再對傳入的數據進行相應的序列化與反系列化操做。
序列化協議
|
簡要介紹
|
優勢
|
缺點
|
SOFA-Hessian
|
hessian2協議,安全改進
|
Java友好,性能較高
|
跨語言支持通常
|
Kryo
|
Kryo框架
|
速度快,序列化後體積小
|
跨語言支持較複雜 ,有一個限制,就是若是服務端增刪字段,客戶端沒有更新會失敗,不支持無參構造函數
|
Protobuf
|
中間描述型
|
跨語言,性能高
|
使用不夠友好,生成類可讀性差,須要工具輔助。
|
JDK
|
JVM原生序列化支持
|
使用方便,無需引入額外依賴
|
速度慢,佔空間,有安全問題,已經再也不使用
|
JSON
|
各類 json庫直接使用
|
跨語言,使用簡單,格式可讀
|
序列化結果大小較大,性能通常,可能存在反序列化漏洞。
|
長按關注,獲取分佈式架構乾貨git
歡迎你們共同打造 SOFAStack https://github.com/alipaygithub