序列化框架Kyro原理与大数据组件中的应用
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
- 点赞
- 收藏
- 关注作者
评论(0)