天天看點

zookeeper原了解析-序列化

1)底層通信資料封裝與操作

BinaryInputArchive& BinaryOutputArchive底層通信資料封裝與操作

    BinaryInputArchive是對于DataInput的封裝,用于處理基于zookeeper協定的底層資料,其實是從DataInputStream輸入中讀取資料。

    BinaryOutputArchive是對于DataOutput的封裝,根據zookeeper協定将資料寫入到DataOutputStream中去。

1.  讀取int, boolean基本資料類型直接代理給DataInput執行

   寫入int, boolean基本資料類型直接代理給DataOutput執行

2.   讀取String和Buffer是,BinaryInputArchive根據Zookeeper協定做了處理

    1) 讀取四個位元組int值表示讀取資料内容的大小

    2) 根據資料大小建構一個byte數組

    3) 将DataInput的資料讀取到位元組數組中

寫入String和Buffer是,BinaryOutputArchive根據Zookeeper協定做了處理

1) 寫入四個位元組int值表示寫入資料内容的大小, 如果寫入資料為null,值為-1

2)将資料轉為位元組數組,寫入DataOutput中

3. 讀取複雜的資料對象,Zookeeper底層傳輸的對象都需要實作Record接口,readRecord方法,會代理給Record進行反序列化

        寫入複雜的資料對象,Zookeeper底層傳輸的對象都需要實作Record接口writeRecord方法,會代理給Record進行序列化

4.   對于Record對象中持有集合對象(當然能夠序列化與反序列化,集合中的元素必須也實作Record):

BinaryInputArchive提供startVector

1)  讀取四個位元組的int數,表示集合的大小

2)  建構一個BinaryIndex對象傳回

      BinaryOutputArchive提供startVector

       向DataOutput資料流中寫入集合大小,如果為null值為-1

 5.  BinaryInputArchive對象的内部類BinaryIndex作用,主要是用來計數集合對象的反序列話的

Record是zookeepr底層通信資料序列化與反序列化統一接口,

2)Record接口

Record是zookeepr底層通信資料序列化與反序列化統一接口

1. 繼承結構

子類以Request結尾的是Client向Server發起請求

子類以Response結尾的是Server向Client發起響應

子類以Txn結尾是Server向Server發起事務請求的

子類以Packet結尾是…???

其他如Id, ACL往往被其他對象持有,不會單獨在網絡傳輸

2. 舉例

1)CreateRequest: 用于在用戶端建立一個節點時向伺服器端發送的請求

序列化CreateRequest,

archive對象是對DataOutput封裝,順序的将資料寫入到DataOutputStream輸出流中去

反序列化CreateRequest,

archive對象是對DataInput封裝,順序的從DataInputStream輸入流中中讀取資料

熬夜不易,點選請老王喝杯烈酒!!!!!!!