序列化框架Kyro原理与大数据组件中的应用

举报
宙斯 发表于 2020/06/05 11:56:51 2020/06/05
【摘要】 Keyo相关知识Kryo 序列化实现原理总结1、先序列化类型(Class实例),并根据类型返回相应的序列化器(Serializer)。2、序列化该类型的值(Object)。3、如果是自定义类型(即不是Java的primitive type),例如(cn.uce.demo.Student),则返回的值序列化器为DefaultSerializers$FieldSerializer,然后一个字段一...

Keyo相关知识


Kryo 序列化实现原理总结


1、先序列化类型(Class实例),并根据类型返回相应的序列化器(Serializer)。


2、序列化该类型的值(Object)。


3、如果是自定义类型(即不是Java的primitive type),例如(cn.uce.demo.Student),则返回的值序列化器为DefaultSerializers$FieldSerializer,然后一个字段一个字段的序列化,当然其序列化类型也是,先类型再值的模式,递归进行,最终完成。


4、引入了对象图(object graph)的概念来消除循环依懒的序列化。已序列化的对象,在循环引用时,只是用一个int类型来表示该对象值,类似一种缓存的概念。

https://cloud.tencent.com/developer/article/1443590


查看keyo的日志


com.esotericsoftware.minlog.Log.TRACE();

或者  

import com.esotericsoftware.minlog.Log;  

import static com.esotericsoftware.minlog.Log.*;  

// ...

Log.set(LEVEL_TRACE);


Kryo源码:  


主入口  

Kryo.writeObject kryo.readObject  

writtenObjects readObjects depth  

类记录名字和ID  

对象记录ID和内容,同一个对象再次遇到时只记录ID。  

使用变长int,long  

FieldSerializer遍历对象的属性来序列化.    


Provided serializers / supporting classes:    


https://github.com/magro/kryo-serializers/


各开源组件对Kryo的使用


是否使用对象引用是可配置的比如spark中。spark.kryo.referenceTracking


Flink是出于性能和Bug原因referenceTrack关了又开


https://issues.apache.org/jira/browse/FLINK-3267


Hive对其他序列化的支持在这个单去掉了:


Remove javaXML serialization

https://issues.apache.org/jira/browse/HIVE-12609


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。