聯系我們 - 廣告服務 - 聯系電話:
您的當前位置: > 關注 > > 正文

全球快資訊丨golang-java-serializer序列化算法解析

來源:CSDN 時間:2023-03-31 07:49:44


(資料圖片)

首先上github項目地址(基本可以直接將go struct直接與java class互轉,覺得可以的大家給顆星)https://github.com/qauzy/huskyhttps://github.com/qauzy/husky項目源于GitHub - davidwang2007/golang-java-serializer: golang library for handle java serialization/deserializationgolang library for handle java serialization/deserialization - GitHub - davidwang2007/golang-java-serializer: golang library for handle java serialization/deserializationhttps://github.com/davidwang2007/golang-java-serializer

Java序列化算法:

java的序列化算法看起來比較簡單,

1 首先是序列化文件頭,接著是類描述符,接著父類的描述符(如果存在),直至沒有父類。

2 接著是數據部分,從父類的成員數據開始,如果成員數據是Object類型還需要先寫入該Object類的描述符,接著才是數據

3 對于ArrayList,HashMap等類型自帶了序列化方法,需要執行特殊序列化

具體過程可以看下面github中例子的解析過程第一部分是序列化文件頭0xACED: magic  聲明使用了序列化協議. 0x05:   version 序列化協議版本. 0x73:   TC_OBJECT. 聲明這是一個新的對象.按順序獲取類描述,類數據塊信息,獲取第[0]塊信息 第二部分是序列化的類的描述[深度:0]0x72: TC_CLASSDESC. 聲明這里開始一個新Class 0x21: 類名字的長度[33] 0x636F6D2E6578616D706C652E64656D6F2E6D6F64656C2E55736572456E74697479: 嘗試讀取類名[com.example.demo.model.UserEntity] 0x48B027EB0BF53976: SerialVersionUID,序列化ID,如果沒有指定,則會由算法隨機生成一個8byte的ID. [添加] [引用] [0] 類型:TC_CLASSDESC[0x72], refVal:{"ClassName":"com.example.demo.model.UserEntity","ScFlag":0,"SerialVersionUID":5237730257103305078,"Fields":null,"RwDatas":null}       0x02: 標記號. 該值聲明該對象支持序列化 0x08: 該類[com.example.demo.model.UserEntity]所包含的域個數,有8個成員第三部分是類[com.example.demo.model.UserEntity]中各個屬性的描述 準備解析類[com.example.demo.model.UserEntity]第1個屬性0x4C: 成員類型[L] 0x05: 成員名字長度 0x6769667473: 成員名字[gifts] 0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x15: 該TC_STRING的長度[21] 0x4C6A6176612F7574696C2F41727261794C6973743B: 字符串原文:Ljava/util/ArrayList; [添加] [引用] [1] 類型:TC_STRING[0x74], refVal:"Ljava/util/ArrayList;" 類[com.example.demo.model.UserEntity]第1個屬性 :type: 0x4C, name: gifts, flag: 0x2, class: Ljava/util/ArrayList;準備解析類[com.example.demo.model.UserEntity]第2個屬性0x5B: 成員類型[[] 0x06: 成員名字長度 0x676966747332: 成員名字[gifts2] 0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x13: 該TC_STRING的長度[19] 0x5B4C6A6176612F6C616E672F537472696E673B: 字符串原文:[Ljava/lang/String; [添加] [引用] [2] 類型:TC_STRING[0x74], refVal:"[Ljava/lang/String;" 類[com.example.demo.model.UserEntity]第2個屬性 :type: 0x5B, name: gifts2, flag: 0x2, class: [Ljava/lang/String;準備解析類[com.example.demo.model.UserEntity]第3個屬性0x4C: 成員類型[L] 0x02: 成員名字長度 0x6964: 成員名字[id] 0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x10: 該TC_STRING的長度[16] 0x4C6A6176612F6C616E672F4C6F6E673B: 字符串原文:Ljava/lang/Long; [添加] [引用] [3] 類型:TC_STRING[0x74], refVal:"Ljava/lang/Long;" 類[com.example.demo.model.UserEntity]第3個屬性 :type: 0x4C, name: id, flag: 0x2, class: Ljava/lang/Long;準備解析類[com.example.demo.model.UserEntity]第4個屬性0x4C: 成員類型[L] 0x06: 成員名字長度 0x6F7468657273: 成員名字[others] 0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x13: 該TC_STRING的長度[19] 0x4C6A6176612F7574696C2F486173684D61703B: 字符串原文:Ljava/util/HashMap; [添加] [引用] [4] 類型:TC_STRING[0x74], refVal:"Ljava/util/HashMap;" 類[com.example.demo.model.UserEntity]第4個屬性 :type: 0x4C, name: others, flag: 0x2, class: Ljava/util/HashMap;準備解析類[com.example.demo.model.UserEntity]第5個屬性0x4C: 成員類型[L] 0x07: 成員名字長度 0x6F746865727332: 成員名字[others2] 0x71: TC_REFERENCE 標識引用 0x7E0004: TC_REFERENCE引用序號[4] 類[com.example.demo.model.UserEntity]第5個屬性 :type: 0x4C, name: others2, flag: 0x2, class: Ljava/util/HashMap;準備解析類[com.example.demo.model.UserEntity]第6個屬性0x4C: 成員類型[L] 0x03: 成員名字長度 0x736F6E: 成員名字[son] 0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x22: 該TC_STRING的長度[34] 0x4C636F6D2F6578616D706C652F64656D6F2F6D6F64656C2F536F6E456E746974793B: 字符串原文:Lcom/example/demo/model/SonEntity; [添加] [引用] [5] 類型:TC_STRING[0x74], refVal:"Lcom/example/demo/model/SonEntity;" 類[com.example.demo.model.UserEntity]第6個屬性 :type: 0x4C, name: son, flag: 0x2, class: Lcom/example/demo/model/SonEntity;準備解析類[com.example.demo.model.UserEntity]第7個屬性0x4C: 成員類型[L] 0x08: 成員名字長度 0x757365724E616D65: 成員名字[userName] 0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x12: 該TC_STRING的長度[18] 0x4C6A6176612F6C616E672F537472696E673B: 字符串原文:Ljava/lang/String; [添加] [引用] [6] 類型:TC_STRING[0x74], refVal:"Ljava/lang/String;" 類[com.example.demo.model.UserEntity]第7個屬性 :type: 0x4C, name: userName, flag: 0x2, class: Ljava/lang/String;準備解析類[com.example.demo.model.UserEntity]第8個屬性0x4C: 成員類型[L] 0x07: 成員名字長度 0x75736572536578: 成員名字[userSex] 0x71: TC_REFERENCE 標識引用 0x7E0006: TC_REFERENCE引用序號[6] 類[com.example.demo.model.UserEntity]第8個屬性 :type: 0x4C, name: userSex, flag: 0x2, class: Ljava/lang/String;0x78: TC_ENDBLOCKDATA,在readObject中,表明數據已經讀取完畢按順序獲取類描述,類數據塊信息,獲取第[1]塊信息 第四部分為對象的父類信息描述 第二部分是序列化的類的描述[深度:1]0x72: TC_CLASSDESC. 聲明這里開始一個新Class 0x21: 類名字的長度[33] 0x636F6D2E6578616D706C652E64656D6F2E6D6F64656C2E42617365456E74697479: 嘗試讀取類名[com.example.demo.model.BaseEntity] 0x01: SerialVersionUID,序列化ID,如果沒有指定,則會由算法隨機生成一個8byte的ID. [添加] [引用] [7] 類型:TC_CLASSDESC[0x72], refVal:{"ClassName":"com.example.demo.model.BaseEntity","ScFlag":0,"SerialVersionUID":1,"Fields":null,"RwDatas":null} 0x02: 標記號. 該值聲明該對象支持序列化 0x01: 該類[com.example.demo.model.BaseEntity]所包含的域個數,有1個成員第三部分是類[com.example.demo.model.BaseEntity]中各個屬性的描述 準備解析類[com.example.demo.model.BaseEntity]第1個屬性0x4C: 成員類型[L] 0x08: 成員名字長度 0x626173654E616D65: 成員名字[baseName] 0x71: TC_REFERENCE 標識引用 0x7E0006: TC_REFERENCE引用序號[6] 類[com.example.demo.model.BaseEntity]第1個屬性 :type: 0x4C, name: baseName, flag: 0x2, class: Ljava/lang/String; 0x78: TC_ENDBLOCKDATA,在readObject中,表明數據已經讀取完畢按順序獲取類描述,類數據塊信息,獲取第[2]塊信息 0x70: TC_NULL,標記后面的數據為空,説明已經沒有父類信息了[深度:2][添加] [引用] [8] 類型:TC_OBJECT[0x73], refVal:{"Classes":[{"ClassName":"com.example.demo.model.UserEntity","ScFlag":2,"SerialVersionUID":5237730257103305078,"Fields":[{"FieldType":76, "FieldName":"gifts","FieldOwnerScFlag":2,"FieldObjectClassName":"Ljava/util/ArrayList;","FieldValue":null},{"FieldType":91,"FieldName":"gifts2","FieldOwnerScFlag":2,"FieldObjectClassNa me":"[Ljava/lang/String;","FieldValue":null},{"FieldType":76,"FieldName":"id","FieldOwnerScFlag":2,"FieldObjectClassName":"Ljava/lang/Long;","FieldValue":null},{"FieldType":76,"FieldNa me":"others","FieldOwnerScFlag":2,"FieldObjectClassName":"Ljava/util/HashMap;","FieldValue":null},{"FieldType":76,"FieldName":"others2","FieldOwnerScFlag":2,"FieldObjectClassName":"Lja va/util/HashMap;","FieldValue":null},{"FieldType":76,"FieldName":"son","FieldOwnerScFlag":2,"FieldObjectClassName":"Lcom/example/demo/model/SonEntity;","FieldValue":null},{"FieldType": 76,"FieldName":"userName","FieldOwnerScFlag":2,"FieldObjectClassName":"Ljava/lang/String;","FieldValue":null},{"FieldType":76,"FieldName":"userSex","FieldOwnerScFlag":2,"FieldObjectCla ssName":"Ljava/lang/String;","FieldValue":null}],"RwDatas":null},{"ClassName":"com.example.demo.model.BaseEntity","ScFlag":2,"SerialVersionUID":1,"Fields":[{"FieldType":76,"FieldName": "baseName","FieldOwnerScFlag":2,"FieldObjectClassName":"Ljava/lang/String;","FieldValue":null}],"RwDatas":null}],"SerialVersionUID":0,"JsonData":null,"RawData":null}第五部分數據信息(類成員值),從父類的Field反序列化[com.example.demo.model.UserEntity] 第五部分數據信息(類成員值),從父類的Field反序列化[com.example.demo.model.BaseEntity]->分解動作 嘗試獲取第[1]個類(可序列化)[com.example.demo.model.BaseEntity]-->第[0]個成員[baseName]值************************BEGIN[baseName]************************解析對象類型類成員[baseName]0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x04: 該TC_STRING的長度[4] 0x62617365: 字符串原文:base [添加] [引用] [9] 類型:TC_STRING[0x74], refVal:"base"************************END[baseName]************************ 第五部分數據信息(類成員值),從父類的Field反序列化[com.example.demo.model.UserEntity]->分解動作 嘗試獲取第[0]個類(可序列化)[com.example.demo.model.UserEntity]-->第[0]個成員[gifts]值 ************************BEGIN[gifts]************************解析對象類型類成員[gifts] [ReadTcObjFieldValue]解析類對象0x73: TC_OBJECT. 聲明這是一個新的對象(未被消費)按順序獲取類描述,類數據塊信息,獲取第[0]塊信息 第二部分是序列化的類的描述[深度:0]0x72: TC_CLASSDESC. 聲明這里開始一個新Class 0x13: 類名字的長度[19] 0x6A6176612E7574696C2E41727261794C697374: 嘗試讀取類名[java.util.ArrayList] 0x7881D21D99C7619D: SerialVersionUID,序列化ID,如果沒有指定,則會由算法隨機生成一個8byte的ID. [添加] [引用] [10] 類型:TC_CLASSDESC[0x72], refVal:{"ClassName":"java.util.ArrayList","ScFlag":0,"SerialVersionUID":8683452581122892189,"Fields":null,"RwDatas":null} 0x03: 標記號. 擁有自己的writeObject, readObject, for example: HashMap, 此種類型需要每一個定義一個相應的結構體 0x01: 該類[java.util.ArrayList]所包含的域個數,有1個成員第三部分是類[java.util.ArrayList]中各個屬性的描述 準備解析類[java.util.ArrayList]第1個屬性0x49: 成員類型[I] 0x04: 成員名字長度 0x73697A65: 成員名字[size] 類[java.util.ArrayList]第1個屬性 :type: 0x49, name: size, flag: 0x3, class: 0x78: TC_ENDBLOCKDATA,在readObject中,表明數據已經讀取完畢按順序獲取類描述,類數據塊信息,獲取第[1]塊信息0x70: TC_NULL,標記后面的數據為空,説明已經沒有父類信息了[深度:1] [添加] [引用] [11] 類型:TC_OBJECT[0x73], refVal:{"Classes":[{"ClassName":"java.util.ArrayList","ScFlag":3,"SerialVersionUID":8683452581122892189,"Fields":[{"FieldType":73,"FieldName":" size","FieldOwnerScFlag":3,"FieldObjectClassName":"","FieldValue":null}],"RwDatas":null}],"SerialVersionUID":0,"JsonData":null,"RawData":null}第五部分數據信息(類成員值),從父類的Field反序列化[java.util.ArrayList]第五部分數據信息(類成員值),從父類的Field反序列化[java.util.ArrayList]->分解動作 嘗試獲取第[0]個類(自定義序列化)[java.util.ArrayList] ************************BEGIN************************ [JavaArrayList] >> =================Blockdata數據塊起始位置=================0x04:   Blockdata數據塊大小[4] 0x77:   在對象的WriteObject方法中,我們可以自定義的寫入數據,除了非Object數據,其他所有數據將會被寫在一起,也就是BlockData 0x04:   固定為0x04 0x04:   數組元素的個數======================讀取第1個數據塊====================== 0x74: TC_STRING.代表一個new String.用String來引用對象(ReadNextEle) [添加] [引用] [12] 類型:TC_STRING[0x74], refVal:"AAAAA" ======================讀取第2個數據塊====================== 0x71: TC_REFERENCE 0x7E000C: TC_REFERENCE引用序號[12] ======================讀取第3個數據塊====================== 0x74: TC_STRING.代表一個new String.用String來引用對象(ReadNextEle) [添加] [引用] [13] 類型:TC_STRING[0x74], refVal:"BBBBB" ======================讀取第4個數據塊====================== 0x71: TC_REFERENCE 0x7E000D: TC_REFERENCE引用序號[13] 0x78:   TC_ENDBLOCKDATA,在readObject中,表明數據已經讀取完畢[JavaArrayList] << ************************END************************ ************************END[gifts]************************嘗試獲取第[0]個類(可序列化)[com.example.demo.model.UserEntity]-->第[1]個成員[gifts2]值 ************************BEGIN[gifts2]************************ 解析數組類型類成員[gifts2]0x13: 類名字的長度[19] 0x5B4C6A6176612E6C616E672E537472696E673B: 嘗試讀取類名[[Ljava.lang.String;] 0xADD256E7E91D7B47: SerialVersionUID,序列化ID,如果沒有指定,則會由算法隨機生成一個8byte的ID. [添加] [引用] [14] 類型:TC_CLASSDESC[0x72], refVal:{"ClassName":"[Ljava.lang.String;","ScFlag":0,"SerialVersionUID":12525169067719228231,"Fields":null,"RwDatas":null} 0x02: 標記號. 該值聲明該對象支持序列化 0x00: 該類[[Ljava.lang.String;]所包含的域個數,有0個成員第三部分是類[[Ljava.lang.String;]中各個屬性的描述0x78: TC_ENDBLOCKDATA,在readObject中,表明數據已經讀取完畢 [添加] [引用] [15] 類型:TC_ARRAY[0x75], refVal:{"ClassDesc":{"ClassName":"[Ljava.lang.String;","ScFlag":2,"SerialVersionUID":12525169067719228231,"Fields":[],"RwDatas":null},"SerialVer sionUID":12525169067719228231,"Values":null,"JsonData":null} 0x70:   TC_NULL,標記后面的數據為空,對應java就是Null 0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x06: 該TC_STRING的長度[6] 0x313131313131: 字符串原文:111111 [添加] [引用] [16] 類型:TC_STRING[0x74], refVal:"111111" 0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x07: 該TC_STRING的長度[7] 0x33333333333333: 字符串原文:3333333 [添加] [引用] [17] 類型:TC_STRING[0x74], refVal:"3333333" 0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x0A: 該TC_STRING的長度[10] 0x34343434343434343434: 字符串原文:4444444444 [添加] [引用] [18] 類型:TC_STRING[0x74], refVal:"4444444444"************************END[gifts2]************************ 嘗試獲取第[0]個類(可序列化)[com.example.demo.model.UserEntity]-->第[2]個成員[id]值 ************************BEGIN[id]************************ 解析對象類型類成員[id] [ReadTcObjFieldValue]解析類對象0x73: TC_OBJECT. 聲明這是一個新的對象(未被消費)按順序獲取類描述,類數據塊信息,獲取第[0]塊信息 第二部分是序列化的類的描述[深度:0]0x72: TC_CLASSDESC. 聲明這里開始一個新Class 0x0E: 類名字的長度[14] 0x6A6176612E6C616E672E4C6F6E67: 嘗試讀取類名[java.lang.Long] 0x3B8BE490CC8F23DF: SerialVersionUID,序列化ID,如果沒有指定,則會由算法隨機生成一個8byte的ID. [添加] [引用] [19] 類型:TC_CLASSDESC[0x72], refVal:{"ClassName":"java.lang.Long","ScFlag":0,"SerialVersionUID":4290774380558885855,"Fields":null,"RwDatas":null}0x02: 標記號. 該值聲明該對象支持序列化 0x01: 該類[java.lang.Long]所包含的域個數,有1個成員第三部分是類[java.lang.Long]中各個屬性的描述 準備解析類[java.lang.Long]第1個屬性0x4A: 成員類型[J] 0x05: 成員名字長度 0x76616C7565: 成員名字[value] 類[java.lang.Long]第1個屬性 :type: 0x4A, name: value, flag: 0x2, class: 0x78: TC_ENDBLOCKDATA,在readObject中,表明數據已經讀取完畢按順序獲取類描述,類數據塊信息,獲取第[1]塊信息 第四部分為對象的父類信息描述 第二部分是序列化的類的描述[深度:1]0x72: TC_CLASSDESC. 聲明這里開始一個新Class 0x10: 類名字的長度[16] 0x6A6176612E6C616E672E4E756D626572: 嘗試讀取類名[java.lang.Number] 0x86AC951D0B94E08B: SerialVersionUID,序列化ID,如果沒有指定,則會由算法隨機生成一個8byte的ID. [添加] [引用] [20] 類型:TC_CLASSDESC[0x72], refVal:{"ClassName":"java.lang.Number","ScFlag":0,"SerialVersionUID":9704295249057472651,"Fields":null,"RwDatas":null} 0x02: 標記號. 該值聲明該對象支持序列化 0x00: 該類[java.lang.Number]所包含的域個數,有0個成員 第三部分是類[java.lang.Number]中各個屬性的描述 0x78: TC_ENDBLOCKDATA,在readObject中,表明數據已經讀取完畢按順序獲取類描述,類數據塊信息,獲取第[2]塊信息0x70: TC_NULL,標記后面的數據為空,説明已經沒有父類信息了[深度:2] [添加] [引用] [21] 類型:TC_OBJECT[0x73], refVal:{"Classes":[{"ClassName":"java.lang.Long","ScFlag":2,"SerialVersionUID":4290774380558885855,"Fields":[{"FieldType":74,"FieldName":"value ","FieldOwnerScFlag":2,"FieldObjectClassName":"","FieldValue":null}],"RwDatas":null},{"ClassName":"java.lang.Number","ScFlag":2,"SerialVersionUID":9704295249057472651,"Fields":[],"RwDa tas":null}],"SerialVersionUID":0,"JsonData":null,"RawData":null}第五部分數據信息(類成員值),從父類的Field反序列化[java.lang.Long] 第五部分數據信息(類成員值),從父類的Field反序列化[java.lang.Number]->分解動作 第五部分數據信息(類成員值),從父類的Field反序列化[java.lang.Long]->分解動作 嘗試獲取第[0]個類(可序列化)[java.lang.Long]-->第[0]個成員[value]值 ************************BEGIN[value]************************0x01: 解析原生類型成員值 1************************END[value]************************ ************************END[id]************************ 嘗試獲取第[0]個類(可序列化)[com.example.demo.model.UserEntity]-->第[3]個成員[others]值 ************************BEGIN[others]************************ 解析對象類型類成員[others] [ReadTcObjFieldValue]解析類對象0x73: TC_OBJECT. 聲明這是一個新的對象(未被消費)按順序獲取類描述,類數據塊信息,獲取第[0]塊信息 第二部分是序列化的類的描述[深度:0]0x72: TC_CLASSDESC. 聲明這里開始一個新Class 0x11: 類名字的長度[17] 0x6A6176612E7574696C2E486173684D6170: 嘗試讀取類名[java.util.HashMap] 0x507DAC1C31660D1: SerialVersionUID,序列化ID,如果沒有指定,則會由算法隨機生成一個8byte的ID. [添加] [引用] [22] 類型:TC_CLASSDESC[0x72], refVal:{"ClassName":"java.util.HashMap","ScFlag":0,"SerialVersionUID":362498820763181265,"Fields":null,"RwDatas":null} 0x03: 標記號. 擁有自己的writeObject, readObject, for example: HashMap, 此種類型需要每一個定義一個相應的結構體 0x02: 該類[java.util.HashMap]所包含的域個數,有2個成員第三部分是類[java.util.HashMap]中各個屬性的描述準備解析類[java.util.HashMap]第1個屬性 0x46: 成員類型[F]0x0A: 成員名字長度 0x6C6F6164466163746F72: 成員名字[loadFactor] 類[java.util.HashMap]第1個屬性 :type: 0x46, name: loadFactor, flag: 0x3, class:準備解析類[java.util.HashMap]第2個屬性0x49: 成員類型[I] 0x09: 成員名字長度 0x7468726573686F6C64: 成員名字[threshold] 類[java.util.HashMap]第2個屬性 :type: 0x49, name: threshold, flag: 0x3, class: 0x78: TC_ENDBLOCKDATA,在readObject中,表明數據已經讀取完畢按順序獲取類描述,類數據塊信息,獲取第[1]塊信息0x70: TC_NULL,標記后面的數據為空,説明已經沒有父類信息了[深度:1] [添加] [引用] [23] 類型:TC_OBJECT[0x73], refVal:{"Classes":[{"ClassName":"java.util.HashMap","ScFlag":3,"SerialVersionUID":362498820763181265,"Fields":[{"FieldType":70,"FieldName":"loa dFactor","FieldOwnerScFlag":3,"FieldObjectClassName":"","FieldValue":null},{"FieldType":73,"FieldName":"threshold","FieldOwnerScFlag":3,"FieldObjectClassName":"","FieldValue":null}],"R wDatas":null}],"SerialVersionUID":0,"JsonData":null,"RawData":null}第五部分數據信息(類成員值),從父類的Field反序列化[java.util.HashMap] 第五部分數據信息(類成員值),從父類的Field反序列化[java.util.HashMap]->分解動作 嘗試獲取第[0]個類(自定義序列化)[java.util.HashMap] ************************BEGIN************************ [JavaHashMap] has 0.000000 buckest [JavaHashMap] has 0 mappings(size)0x74: TC_STRING.代表一個new String.用String來引用對象(ReadNextEle) [添加] [引用] [24] 類型:TC_STRING[0x74], refVal:"1qqqq" 0x71: TC_REFERENCE 0x7E0018: TC_REFERENCE引用序號[24] 0x74: TC_STRING.代表一個new String.用String來引用對象(ReadNextEle) [添加] [引用] [25] 類型:TC_STRING[0x74], refVal:"4rrrr" 0x71: TC_REFERENCE 0x7E0019: TC_REFERENCE引用序號[25] 0x74: TC_STRING.代表一個new String.用String來引用對象(ReadNextEle) [添加] [引用] [26] 類型:TC_STRING[0x74], refVal:"2wwww" 0x71: TC_REFERENCE 0x7E001A: TC_REFERENCE引用序號[26] 0x74: TC_STRING.代表一個new String.用String來引用對象(ReadNextEle) [添加] [引用] [27] 類型:TC_STRING[0x74], refVal:"3eeee" 0x71: TC_REFERENCE 0x7E001B: TC_REFERENCE引用序號[27] 0x78:   TC_ENDBLOCKDATA,在readObject中,表明數據已經讀取完畢************************END************************ ************************END[others]************************ 嘗試獲取第[0]個類(可序列化)[com.example.demo.model.UserEntity]-->第[4]個成員[others2]值 ************************BEGIN[others2]************************ 解析對象類型類成員[others2] [ReadTcObjFieldValue]解析類對象0x73: TC_OBJECT. 聲明這是一個新的對象(未被消費)按順序獲取類描述,類數據塊信息,獲取第[0]塊信息0x71:   TC_REFERENCE 標識引用 0x7E0016:       TC_REFERENCE引用序號[22](OBJECT-->TC_CLASSDESC)--> java.util.HashMap [添加] [引用] [28] 類型:TC_OBJECT[0x73], refVal:{"Classes":[{"ClassName":"java.util.HashMap","ScFlag":3,"SerialVersionUID":362498820763181265,"Fields":[{"FieldType":70,"FieldName":"loa dFactor","FieldOwnerScFlag":3,"FieldObjectClassName":"","FieldValue":null},{"FieldType":73,"FieldName":"threshold","FieldOwnerScFlag":3,"FieldObjectClassName":"","FieldValue":null}],"R wDatas":[{"ClassDesc":null,"LoadFactor":0.75,"Thredshold":12,"Buckets":16,"Entries":{"1qqqq":"1qqqq","2wwww":"2wwww","3eeee":"3eeee","4rrrr":"4rrrr"}}]}],"SerialVersionUID":0,"JsonData ":null,"RawData":null}第五部分數據信息(類成員值),從父類的Field反序列化[java.util.HashMap] 第五部分數據信息(類成員值),從父類的Field反序列化[java.util.HashMap]->分解動作 嘗試獲取第[0]個類(自定義序列化)[java.util.HashMap] ************************BEGIN************************ [JavaHashMap] has 0.000000 buckest [JavaHashMap] has 0 mappings(size)0x74: TC_STRING.代表一個new String.用String來引用對象(ReadNextEle) [添加] [引用] [29] 類型:TC_STRING[0x74], refVal:"1tttt" 0x71: TC_REFERENCE 0x7E001D: TC_REFERENCE引用序號[29] 0x78:   TC_ENDBLOCKDATA,在readObject中,表明數據已經讀取完畢************************END************************ ************************END[others2]************************ 嘗試獲取第[0]個類(可序列化)[com.example.demo.model.UserEntity]-->第[5]個成員[son]值 ************************BEGIN[son]************************ 解析對象類型類成員[son] [ReadTcObjFieldValue]解析類對象 0x73: TC_OBJECT. 聲明這是一個新的對象(未被消費) 按順序獲取類描述,類數據塊信息,獲取第[0]塊信息 第二部分是序列化的類的描述[深度:0]0x72: TC_CLASSDESC. 聲明這里開始一個新Class 0x20: 類名字的長度[32] 0x636F6D2E6578616D706C652E64656D6F2E6D6F64656C2E536F6E456E74697479: 嘗試讀取類名[com.example.demo.model.SonEntity] 0x01: SerialVersionUID,序列化ID,如果沒有指定,則會由算法隨機生成一個8byte的ID. [添加] [引用] [30] 類型:TC_CLASSDESC[0x72], refVal:{"ClassName":"com.example.demo.model.SonEntity","ScFlag":0,"SerialVersionUID":1,"Fields":null,"RwDatas":null} 0x02: 標記號. 該值聲明該對象支持序列化 0x01: 該類[com.example.demo.model.SonEntity]所包含的域個數,有1個成員第三部分是類[com.example.demo.model.SonEntity]中各個屬性的描述 準備解析類[com.example.demo.model.SonEntity]第1個屬性0x4C: 成員類型[L] 0x07: 成員名字長度 0x536F6E4E616D65: 成員名字[SonName] 0x71: TC_REFERENCE 標識引用 0x7E0006: TC_REFERENCE引用序號[6] 類[com.example.demo.model.SonEntity]第1個屬性 :type: 0x4C, name: SonName, flag: 0x2, class: Ljava/lang/String; 0x78: TC_ENDBLOCKDATA,在readObject中,表明數據已經讀取完畢按順序獲取類描述,類數據塊信息,獲取第[1]塊信息0x70: TC_NULL,標記后面的數據為空,説明已經沒有父類信息了[深度:1] [添加] [引用] [31] 類型:TC_OBJECT[0x73], refVal:{"Classes":[{"ClassName":"com.example.demo.model.SonEntity","ScFlag":2,"SerialVersionUID":1,"Fields":[{"FieldType":76,"FieldName":"SonNa me","FieldOwnerScFlag":2,"FieldObjectClassName":"Ljava/lang/String;","FieldValue":null}],"RwDatas":null}],"SerialVersionUID":0,"JsonData":null,"RawData":null}第五部分數據信息(類成員值),從父類的Field反序列化[com.example.demo.model.SonEntity] 第五部分數據信息(類成員值),從父類的Field反序列化[com.example.demo.model.SonEntity]->分解動作 嘗試獲取第[0]個類(可序列化)[com.example.demo.model.SonEntity]-->第[0]個成員[SonName]值 ************************BEGIN[SonName]************************ 解析對象類型類成員[SonName]0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x13: 該TC_STRING的長度[19] 0x5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A: 字符串原文:ZZZZZZZZZZZZZZZZZZZ [添加] [引用] [32] 類型:TC_STRING[0x74], refVal:"ZZZZZZZZZZZZZZZZZZZ"************************END[SonName]************************ ************************END[son]************************ 嘗試獲取第[0]個類(可序列化)[com.example.demo.model.UserEntity]-->第[6]個成員[userName]值 ************************BEGIN[userName]************************ 解析對象類型類成員[userName]0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x07: 該TC_STRING的長度[7] 0x31313131313131: 字符串原文:1111111 [添加] [引用] [33] 類型:TC_STRING[0x74], refVal:"1111111"************************END[userName]************************ 嘗試獲取第[0]個類(可序列化)[com.example.demo.model.UserEntity]-->第[7]個成員[userSex]值 ************************BEGIN[userSex]************************ 解析對象類型類成員[userSex]0x74: TC_STRING.如果成員類型是對象,則后面跟著一個該對象的類名 0x0E: 該TC_STRING的長度[14] 0x3232323232323232326461736464: 字符串原文:222222222dasdd [添加] [引用] [34] 類型:TC_STRING[0x74], refVal:"222222222dasdd"  

責任編輯:

標簽:

相關推薦:

精彩放送:

新聞聚焦
Top 岛国精品在线