3 dubbo-serialization
Dubbo 為了支援多種序列化算法,單獨抽象了一層 Serialize 層,在整個 Dubbo 架構中處于最底層,對應的子產品是 dubbo-serialization 子產品。
- dubbo-serialization 子產品
-
Dubbo的多種序列化算法(下)3 dubbo-serialization - 定義了 Dubbo 序列化層的核心接口,其中最核心的是 Serialization 接口,它是一個擴充接口,被 @SPI 接口修飾,預設擴充實作是 Hessian2Serialization。
- Serialization 接口
-
Dubbo的多種序列化算法(下)3 dubbo-serialization - Dubbo 提供了多個 Serialization 接口實作,用于接入各種各樣的序列化算法
-
Dubbo的多種序列化算法(下)3 dubbo-serialization - 這裡我們以預設的 hessian2 序列化方式為例,介紹 Serialization 接口的實作以及其他相關實作。
-
Dubbo的多種序列化算法(下)3 dubbo-serialization - Hessian2Serialization 中的 serialize() 方法建立的 ObjectOutput 接口實作為 Hessian2ObjectOutput,繼承關系如下圖所示:
在 DataOutput 接口中定義了序列化 Java 中各種資料類型的相應方法,如下圖所示,其中有序列化 boolean、short、int、long 等基礎類型的方法,也有序列化 String、byte[] 的方法。
ObjectOutput 接口繼承了 DataOutput 接口,并在其基礎之上,添加了序列化對象的功能,具體定義如下圖所示,其中的 writeThrowable()、writeEvent() 和 writeAttachments() 方法都是調用 writeObject() 方法實作的。
Hessian2ObjectOutput 中會封裝一個 Hessian2Output 對象,需要注意,這個對象是 ThreadLocal 的,與線程綁定。在 DataOutput 接口以及 ObjectOutput 接口中,序列化各類型資料的方法都會委托給 Hessian2Output 對象的相應方法完成,實作如下:
public class Hessian2ObjectOutput implements ObjectOutput {
private static ThreadLocal<Hessian2Output> OUTPUT_TL = ThreadLocal.withInitial(() -> {
// 初始化Hessian2Output對象
Hessian2Output h2o = new Hessian2Output(null); h2o.setSerializerFactory(Hessian2SerializerFactory.SERIALIZER_FACTORY);
h2o.setCloseStreamOnClose(true);
return h2o;
});
private final Hessian2Output mH2o;
public Hessian2ObjectOutput(OutputStream os) {
mH2o = OUTPUT_TL.get(); // 觸發OUTPUT_TL的初始化
mH2o.init(os);
}
public void writeObject(Object obj) throws IOException {
mH2o.writeObject(obj);
}
... // 省略序列化其他類型資料的方法
}
Hessian2Serialization 中的 deserialize() 方法建立的 ObjectInput 接口實作為 Hessian2ObjectInput,繼承關系如下所示:
Hessian2ObjectInput 具體的實作與 Hessian2ObjectOutput 類似:在 DataInput 接口中實作了反序列化各種類型的方法,在 ObjectInput 接口中提供了反序列化 Java 對象的功能,在 Hessian2ObjectInput 中會将所有反序列化的實作委托為 Hessian2Input。