全球快资讯丨golang-java-serializer序列化算法解析
(资料图片)
首先上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"
标签:
相关推荐:
精彩放送:
- []视焦点讯!方圆生活服务:2022年总收入约为人民币5.11亿元
- []太平洋保险的税优识别码,在保单右上方查找
- []天天报道:领悦服务集团:2022年收益为人民币5.77亿元
- []保险公司排名一览表,十大公司排名
- []天天新消息丨养老保险种类
- []【天天聚看点】燕塘乳业2022年营收18.8亿 新零售业务逆势增长58%
- []统筹公司倒闭车险不能理赔怎么办
- []天天动态:保利发展:2022年实现营业总收入2811.08亿元
- []远洋集团:2022年营业额为人民币461.27亿元
- []疫情隔离保险在哪买,有以下三种方法
- []环球热推荐:“快递一哥”顺丰控股去年净利增长45%,前十大股东中4位去年四季度在减持
- []环球今亮点!村民不认可孙国友被称治沙英雄是什么情况
- []全球微头条丨东胜智慧城市服务2022年收入2.27亿港元 同比增加约77%
- []天天快资讯丨新华联所持长沙银行1.39亿股司法拍卖已完成过户手续
- []金茂投资:2022年实现营业收入771.64亿元
- []移卡创始人称数字生活正在加速由2.0进入3.0时代
- []热点评!青岛双星: 您的提问涉及到公司与合作方的商业秘密不便透露,敬请谅解
- []助力乡村振兴 长安汽车帮扶酉阳茶油可持续发展
- []世界讯息:郑州航空港区购房每平方米补贴300元 不限户籍、不限区域
- []建发股份:2022年归属股东净利润62.82亿元
- []首旅酒店:2022年归属股东净亏损5.82亿元
- []直真科技:3月29日公司高管彭琳明减持公司股份合计10000股
- []当前观察:合肥今年首批集中供地揽金约89亿元
- []亚朵集团上市首份成绩单:2022年净利润同比增85.6%
- []美联储更担心通胀年内至少加息一次,黄金腾飞
- []每日头条!交通银行副行长周万阜:财富管理业务具有很大的发展空间
- []协会属于什么性质企业
- []均胜电子:2022年净利3.94亿元 同比扭亏为盈
- []当前最新:发行股票的手续费计入什么科目
- []动态:配债100元一股要不要买
- []焦点热讯:归母利润是什么意思
- []绿景中国地产:2022年归属股东净亏损7.30亿元
- []华侨城:2022年归属股东净亏损109.05亿元
- []最资讯丨两部门:推动常态化开展“带押过户”服务,实现地域范围、金融机构和不动产类型全覆盖
- []焦点讯息:海尔智家2022年财报:业绩双增,利润增速超营收
- []精选!英诺特2022年净利1.51亿同比增长25.31% 董事长叶逢光薪酬12万
- []环球精选!财报金选丨万科企业2022年度营收5038.4亿元,同比增长11.3%
- []全球快看点丨万科晒年报:行业震荡中实现业绩企稳,经营服务业务收入突破500亿
- []【热闻】金辉控股:2022年净利润约为人民币20.8亿元
- []焦点消息!中科金财:公司业务和回款一直以来均具有季节性特征,四季度回款量较大
- []安徽天堂寨在哪里_安徽天堂寨
- []粤海置地:2022年归属股东净利润3.93亿港元
- []指南针:公司业务目前不涉及ChatGPT相关应用,也暂未有从事AI基础研究计划
- []焦点讯息:精研科技:随着人工智能的发展,我们认为在以下几个方面会有更多、更高效的散热方案需求
- []富通信息:公司专业从事以光纤光缆制造为核心的光通信业务和以石英管材产品为辅助的石英制品业务
- []鲁商发展:2022年归属股东净利润0.45亿元
- []中国中铁:2022年房地产业务新签合同额751.9亿元
- []当前热议!中梁控股:2022年实现收入393.3亿元
- []【世界热闻】建发物业:2022年实现收入22.90亿元
- []近期经济运行亮点 | 甘肃省临夏州重锤敲响项目建设起势锣 凝心聚力力保有效投资开门红
- []鲁商服务:2022年实现收入6.27亿元
- []快资讯:陆家嘴:2022年实现营业收入117.62亿元
- []当前关注:中骏商管:2022年实现收入11.82亿元
- []水井坊:一季度业绩详见拟于4月份披露的公司一季度报告
- []环球关注:福星股份:2022年实现收入151.42亿元
- []沿海家园:出售珠海沿海股权事项补充材料将延迟至5月31日寄发
- []每日视讯:微盟发布2022年报:总营收18亿元 下半年亏损环比收窄0.8亿
- []ST宏达:公司目前没有对外引进资产的计划,如有相关计划将按规则及时披露
- []环球最资讯丨溢价近90%战投荣盛石化,沙特阿美的野心不止于此
- []焦点速递!斩获储能双奖|华塑闪耀金砖储能大会
- []每日热点:跌无可跌,新能源板块暴力反弹一触即发!
- []两款手机表现有何不同?选HUAWEI magic5,还是oppofindx6?
- []环球热文:浙江海曙区2022年下半年非自然人家庭屋顶光伏项目补贴资金120198元
- []热推荐:比亚迪年报发布!2022年平均日营收11.62亿元!
- []环球速读:450MWh!宁德时代海外储能提速!
- []“双碳目标”驱动箭牌家居绿色发展,以身作则引领行业绿色智造升级
- []实时焦点:在这里,孩子们感受家的温暖(一线调研)
- []合肥第二批供地挂牌11宗地块 总起始价98.44亿元
- []全球动态:中国铁建:2022年房地产开发业务实现收入622.53亿元
- []沙河股份:2022年实现收入7.63亿元
- []天天亮点!沙河股份2022年营业收入7.64亿元 房地产销售收入占98.45%
- []环球滚动:港发展局指交椅洲人工岛每年平开支只占政府每年总开支不到5%
- []楚江新材:公司产品暂未应用于固态氢能发电领域
- []怎么野,你说了算!奇瑞首款轻越野TJ-1开启全球征名
- []当前看点!九安医疗:持续血糖监测仪(CGMS)研发项目是公司募投项目之一,目前处于研发阶段,还需要一段时间
- []世界速读:通策医疗:公司不存在挪用资金情形,也不存在被ST的情形
- []支付宝出境游服务覆盖超过70个国家和地区 最新去韩国可用支付宝买火车票
- []前沿热点:21566人参观!2023中国国际清洁能源博览会暨中国氢能展圆满落幕
- []环球热资讯!身体抱恙是什么意思?抱恙出自哪里?
- []putup加动词什么形式?putup是什么意思?
- []【全球聚看点】金地集团29.95亿元公司债将付息 利率分别为3.91%及4.30%
- []今日精选:北京故宫的特点有哪些?北京故宫资料介绍?
- []几套房要征收房产税?房产税怎么征收?
- []天天热资讯!厦门象屿完成发行23亿中期票据 利率1.69%
- []天天视点!“创”字当头“智”造为先 泸州老窖荣获2022年度四川省科学技术进步奖一等奖
- []当前时讯:斛珠的意思是什么?斛珠出自哪里?
- []12万买宝马? 营销噱头多于让利,难助力宝马电动化转型
- []实时:金管局:港家庭负债占GDP比率升至95.5%
- []盘它是什么意思?盘它一词的来源是什么?
- []全球看点:新地香港apm复活节生意额料增25%
- []每日讯息!吸附在鲨鱼身上的鱼是什么鱼?吸附在鲨鱼身上的鱼有什么特征?
- []世界今日讯!华润建筑有限公司是国企吗?华润建筑有限公司资料介绍?
- []当前滚动:公司社保怎么办理?公司社保的办理方式?
- []野风现代中心二期6.4亿元ABS项目更新至“已受理”
- []要闻:张辽和张颌是什么关系?张辽的简单介绍?
- []天天热推荐:3月30日豪迈科技涨停分析:风电,轮胎概念热股
- []全球即时:3月30日江波龙涨停分析:闪存,DRAM(内存),大基金概念概念热股
- []世界最资讯丨如何自然疏通浴室水槽
- []关上灯,点亮希望——宁波阪急响应“地球一小时”活动
- []【全球时快讯】求生之路2怎么局域网联机?局域网联机方法详解
- 华为光纤猫指示灯有什么用?华为光纤猫指示灯功能介绍
- 今日看点:bot短期密集访问形成的流量高峰有哪些?如何解决?
- 全球快资讯丨golang-java-serializer序列化算法解析
- 全球讯息:上坤地产:杨占东辞任执行董事 继续担任执行总裁职务
- 焦点快播:【python】Python中最常用的数据类型
- 每日视讯:去年地产板块收入降超四成 金隅集团今年要“下更大力度去库存”
- TD早报 | 多方回应搭飞机坐高铁是否需要佩戴口罩;国航:暂未接到下调机票燃油费相关通知
- 世界通讯!3月31日财经早餐:美元走软和美债收益率下降推动黄金需求,关注美国通胀数据
- 观热点:二六三(002467)2022年年报财务简析:增收不增利
- 弘阳地产:2022年实现收入200.13亿元
- B站注册资本增幅400%至5亿 目前由陈睿全资持股
- 光源资本出任独家财务顾问 沐曦集成电路10亿元A轮融资宣告完成
- 巨轮智能2021年上半年营收11.24亿元 期内研发费用投入增长19.05%
- 红枣期货尾盘拉升大涨近6% 目前红枣市场总库存约30万吨
- 嘉银金科发布2021年Q2财报 期内净利润达1.27亿元同比增长208%
- 成都银行2021上半年净利33.89亿元 期内实现营收同比增长17.27亿元
- 汽车之家发布2021年第二季度业绩 期内新能源汽车品牌收入增长238%
- 中信银行上半年实现净利润290.31亿元 期末不良贷款余额706.82亿元
- 光伏概念掀起涨停潮交易价格创新高 全天成交额达1.29亿元
- 上半年生物药大增45% 关键财务指标好转营收账款持续下降
- 全球微动态丨联想ThinkPad有哪些型号?联想ThinkPad各系列型号介绍
- 华为HiLink是什么?华为路由器hilink怎么用?
- QQ网络硬盘在哪?如何添加QQ界面?
- 世界今热点:躲过15次GC之后 进入老年代系统有哪些规则?
- iPhone5怎么升级ios7?8款苹果设备升级更新
- 克而瑞深度解读百瑞纪首本《住房租赁轻资产运营白皮书》
- 每日快播:张坤隐形重仓股曝光 再谈投资:每一次市场的大幅下跌 股票都是在“打折促销”
- 网吧服务器维护工具怎么下载?网吧维护管理助手使用方法
- 摄像机的焦距是什么意思?摄像机焦距对应距离介绍
- 世界即时看!【剑灵力士】新版本力士职业天赋加点推荐 备战不删档
- 每日头条!如何打开pdg文件?手把手教你打开PDG文件
- 每日热文:湖北长阳农商银行被罚60万元:因违规办理展期业务等
- 福建莆田市住房公积金政策调整 最低首付款比例20%
- 当前时讯:湖北襄阳出台购房新政 多孩家庭可获4万元补贴
- 微速讯:中建一局集团完成发行30亿票据 利率2.20%
- 西藏:适当提高住房公积金贷款最高额度
- 当前视讯!拉芳家化:公司将在2023年4月份公布2022年度的经营情况,还请届时关注
- 焦点要闻:众信旅游:目前,公司核心团队人员情况稳定,不存在专业人才流失的情况
- 全球热资讯!越秀资本完成发行8亿短期融资券 票面利率2.32%
- 来宾彩印手提无纺布袋定制,环保无纺布袋制作厂家
- 携程集团CEO孙洁:出入境游年底会反弹至80%水平
- 世界微动态丨日本角川出版公司奥运项目负责人承认向东京奥组委官员行贿
- 合肥2023首场土拍落幕 13宗地块成交总揽金约88.49亿元
- 全球热点评!东星医疗:公司若有股权激励计划,将根据相关规定及时履行信息披露义务
- 成都双流板桥轨道公司100%股权挂牌将满一年 目前尚未成功转让
- 天天快看:武汉城建开元森泊度假乐园项目签约 投资总额达22亿元
- 即时:合生创展2022年实现核心利润10.81亿港元 同比下降77.27%
- 【新视野】一张图:黄金原油外汇股指"枢纽点+多空占比"一览(2023/03/30周四)
- 欧盟就2030年可再生能源目标达成协议 成员国42.5%的能源将来自风能等可再生能源
- 碧桂园2022年股东应占核心净利润26.1亿元
- 碧桂园:2022年股东应占核心净利润约26.1亿元
- 【全球速看料】美日反弹若延续,将挑战132.85和135阻力!
- 环球热点!运城城建集团拟发行10亿元中期票据 期限3年
- 世界微速讯:现货黄金交易策略:多空陷入“拉锯战”,关注初请数据和美联储官员讲话
- 蒙特利尔银行上调贵金属价格预期,预测黄金表现优于白银!
- 合生创展集团:2022年股权持有人应占溢利为87.62亿港元
- 【全球新要闻】雅居乐:2022年实现收入540.34亿元
- 全球即时:你的员工在出差期间安全吗?了解旅行风险管理标准来规避风险
- 天天百事通!财报金选丨合生创展2022年营业额272.52亿港元 核心利润10.81亿港元
- 快资讯丨复星国际郭广昌:艰难的2022年已经过去 要往前走
- 环球热点评!西藏:适当提高住房公积金贷款最高额度 推行“公积金+商业”组合贷
- 融创近百亿美元境外债重组方案公布
- 天天播报:【BT金融分析师】开市客会员业务大幅增长,分析师称其可能会提高会员费
- 【BT金融分析师】中国玉柴营收大幅增长,分析师称疫情好转后基建带动重卡爆发
- 当前速递!一个月港元拆息升0.71点子至3.18202%
- 中兵红箭:公司CVD法工业金刚石的下游应用领域目前只在消费领域有应用,没有应用在其他领域
- 每日看点!中国汽车流通协会会长沈进军:延长“国六A”车型销售期的相关政策即将出台
- 【天天速看料】万达酒店发展去年收入8.17亿港元,预计今年新增至少30家酒店
- 天天实时:春风十里,光储绽放,天合储能亮相CEEC 2023
- 天天微动态丨【威海福彩·开奖公告】贺17万元双色球二等奖喜降我市
- 嘉和美康:截至3月10日,公司的股东人数为7092户
- 环球微头条丨大和:阿里巴巴业务重组 菜鸟、本地服务业务分拆上市可能性增加
- 天天快资讯丨泡泡玛特涨超10% 2022年海外市场收入同比增长147.1%
- 郭广昌:2022年复星的确受到很大损失 好在穿过这场风暴
- 港发展局指环团对交椅洲人工岛项目工程加剧政府财赤说法流于武断
- 全球速递!南昌经开区:凡购买商品住宅和非住宅即发放购房现金
- 世界热资讯!东方电热:谢谢您对公司的关心!公司多晶硅还原炉产品今年交货期主要集中在5月至6月
- 全球速递!新朋股份:目前公司尚无上述领域业务。请注意投资风险
- 天天看热讯:理事是什么职位
- 全球热消息:长三角旅游消费复苏正当时:3月份旅游订单量同比实现翻倍式增长
- 世界时讯:怠慢是什么意思?怠慢的出处是哪里?
- 锂电池股票龙头有哪些
- 当前热议!阳光财产保险股份有限公司是国企吗
- 环球快资讯丨coser是什意思?coser怎么理解?
- 【世界新要闻】退市整理期的股票可以买吗
- 四川泸州市古蔺县在哪里?四川泸州市古蔺县资料介绍?
- 对比明显!湖人首发包揽107分 替补仅由施罗德和八村得到14分
- 青云志周小环结局是什么?周小环是一个什么样的角色?
- 商务局和外经贸局是一回事吗?商务局和外经贸局有什么区别?
- 快消息!企业管理学基础知识有哪些?企业管理学基础知识体现于管理学的特点?
- 当前要闻:美国地理位置怎么样?美国地理位置的优越性有哪些?
- 全球快看:什么播放器可以看港澳台直播?可以看港澳台直播的播放器有哪些?
- 天天速递!给领导的祝福语怎么写?写给领导的祝福语有哪些?
- 进气压力传感器的工作原理是什么?进气压力传感器怎么工作?
- 每日消息!深圳控股盘初升约10% 2022年全年度亏转盈赚20.85亿元
- 银城国际控股:2022年归属股东净亏损9.99亿元
- 华发物业:2022年实现收入15.99亿元
- 中央气象台:华北中南部黄淮西部大气扩散条件一般 西北部分地区将有沙尘天气
- 全球速读:达实智能:物联网和工业互联网都与企业数字化、信息化建设密切相关
- 天天短讯!金银多头福音来了!机构大幅上调均价预期
- 黄金市场分析:银行危机情绪极大缓解 黄金继续高位盘整
- 烨星集团:2022年净亏损5187万元
- 土坑酸菜事件后,康师傅的“顺风顺水”也被踩碎
- 顺丰控股:1-2月累计达成国内速运物流业务量13%增速和收入10%增速
- 【环球快播报】粤桂股份:加大甘蔗产业发展符合我们的基本战略,是否提炼乙醇需结合企业实际进行论证
- 天天微速讯:3月30日限售股解禁一览(名单)
- 酒店规定引争议,一家三口能不能住标间?
- 填权是什么意思
- 当前观察:沈阳首套房利率降至3.8%,支持公寓类非住宅去库存,前两月个人按揭贷款下降45.9%
- 【世界新要闻】绿城中国业绩会上刚提拿地目标,今日已收获杭州两宗地
- 雄安建设有序推进,荣盛发展稳增长行情日渐清晰
- 当前关注:远洋集团完成共计2060万美元次级永续美元债票息兑付
- 观点:第一服务控股:2022年收益约为人民币11.22亿元
- 元道通信:世界人工智能技术已经出现了突破,将深刻改变人们的生产生活方式
- 环球微动态丨东南网架:公司将根据发展战略,综合对下属子公司进行规划
- 最新消息:德固特:公司未开展碳捕集相关领域的研究活动。谢谢您对公司的关心与支持!
- 每日热闻!信德新材:截至目前,公司与荣盛石化没有业务往来
- 天天速递!东北证券:二季度A股震荡依旧 政策导向的行业占优
- 简讯:又见牛市长期起点!顶流刘格菘、傅鹏博、冯明远最新判断出炉 新进哪些股
- 看点:机构扎堆调研AI!中金公司、易方达基金、PAG等都出手了