1.《深入理解序列化与反序列化》作者为资深互联网工程师,具有丰富的从业经验,先后在百度、猎豹、快手等互联网公司从事大数据及后台开发工作,擅长大数据、分布式系统及后台高并发技术,喜欢探索技术原理,了解众多开发人员工作中的难点和痛点。《深入理解序列化与反序列化》书深入浅出地讲解了互联网后台很重要的序列化技术,并对5种主流序列化技术进行性能分析和综合对比,能帮助开发人员更好地应对不同场景下的序列化需求。
2.阿里、腾讯、百度、快手、“中产之路”公众号、乐言科技等互联网公司众多业界大咖联袂力荐。
恰当的序列化方案不仅可以提高系统的通用性、强健性、安全性,优化系统性能,而且会让系统更加易于调试、便于扩展。《深入理解序列化与反序列化》从最基本的计算机编码知识入手,接着从内部机制、工作原理、核心类剖析、应用示例等方面对大数据、分布式架构中广泛应用的5种主流序列化技术――Java序列化、JSON、Thrift、Protocol Buffer和Avro进行深入讲解,最后从序列化后的数据大小(空间)、序列化耗时(时间)、反序列化耗时(时间)三个维度对5种序列化技术进行性能分析和综合对比,让读者对序列化技术有更全面和深入的理解,从而更好地应对不同场景下的序列化需求。
《深入理解序列化与反序列化》兼顾技术原理和技术应用,适合初级开发者、高级开发人员、架构师及技术专家使用。
随着互联网技术的高速发展,涌现出了大数据、微服务等技术。这些技术背后都是分布式技术的高水平应用。分布式技术的核心之一便是服务或组件之间的数据交互。要在分布式系统中高效地交互数据,数据序列化与反序列化技术起着关键作用。将结构化的对象和扁平的二进制流进行相互转换,是序列化技术解决的核心问题。这个问题听起来简单,却耗费了几代技术人的心血。从JDK1.1提供序列化机制到盛行的Thrift、Protocol Buffer,序列化技术不断更替演进,其间出现过的序列化技术不少于20种。如今,那些令人尊敬的技术专家们仍未停止探索的脚步,这听起来确实令技术爱好者兴奋,毕竟技术可期。
序列化技术被广泛用于数据传输、数据存储中,不同业务场景的需求不尽相同,技术方案的侧重也不尽相同。要在众多序列化技术方案中选择一款适合应用场景的技术,要求技术选型者对序列化方案有深入且全面的了解。从实现机制到性能,从开发复杂度到快速应用,如何准确评估一款序列化技术是否适合应用场景?这无形中对开发人员提出了更高的要求。
互联网上有较多关于序列化技术应用的资料,但技术覆盖点不够全、重复点较多,未能较全面地梳理序列化技术知识体系。笔者也经历了这个技术学习过程,于是产生了一个想法:对现有的主流序列化技术进行较深入的梳理和解读,让读者能快速获取序列化技术体系的知识,深入理解各种序列化技术的实现原理、差异性及场景适用性。
本书兼顾技术原理和技术应用,适合初级开发者、高级开发人员、架构师及技术专家使用。为了帮助读者在阅读本书时达到事半功倍的目的,笔者给出两个学习建议:1)实践本书中的代码,将理解落地;2)结合源码和本书提供的原理阐述去理解技术内容。
感谢电子工业出版社编辑牛晓丽老师的严谨态度和辛勤付出,使得本书能够顺利完成。更感谢牛老师多次对日期的宽限,才使得笔者能安心写作。
感谢好友岳京杭,通过他的引荐,笔者才有机会和牛老师沟通并落实想法。
感谢工作以来帮助过我的领导和同事们,特别是在快手工作的两年,专家们的技术高度和对技术的态度,深深影响了我。
感谢业界的各位技术“大牛”不吝笔墨为本书撰写推荐序和推荐语。
最后,感谢家人和朋友们在本书写作过程中提供的支持和帮助。
第一部分 技术基础
第1章 基础知识
1.1 计算机编码
1.1.1 比特、字节与字符
1.1.2 字节对齐
1.1.3 数字的表示
1.1.4 Big-Endian与Little-Endian
1.2 字符编码
1.2.1 字符集与字符编码
1.2.2 英文字符集与编码
1.2.3 中文字符集与编码
1.2.4 Unicode字符集与编码
1.3 Base64编码
1.3.1 编码规则
1.3.2 解码规则
1.3.3 索引表
1.3.4 编码与解码示例
1.3.5 Java应用示例
1.4 Varint编码
1.4.1 编码规则
1.4.2 Varint编码示例
1.4.3 Varint编码的不足
1.5 ZigZag编码
1.5.1 ZigZag编码流程
1.5.2 ZigZag编码算法实现
1.5.3 ZigZag反编码流程
1.5.4 ZigZag反编码算法实现
1.5.5 总结
1.6 初识序列化/反序列化
1.6.1 技术背景
1.6.2 技术特征
1.6.3 IDL序列化引擎
第二部分 序列化技术介绍
第2章 Java序列化
2.1 Java序列化入门
2.1.1 Java序列化实现方式
2.1.2 Java序列化应用
2.2 Java序列化核心类
2.2.1 Serializable
2.2.2 Externalizable
2.2.3 ObjectOutputStream
2.2.4 ObjectInputStream
2.3 Java序列化原理
2.3.1 基本类型的序列化流程
2.3.2 基本类型数据的序列化大小
2.3.3 对象类型的序列化流程
2.3.4 对象类型的序列化数据成分
2.4 Java序列化高级特性
2.4.1 transient关键字
2.4.2 static关键字
2.4.3 serialVersionUID
2.4.4 序列化/反序列化hook
2.4.5 数据校验
2.5 选择Serializable还是Externalizable
2.6 Java序列化安全
2.6.1 SealedObject
2.6.2 SignedObject
2.7 小结
第3章 JSON
3.1 JSON结构
3.1.1 JSON值类型
3.1.2 JSON语法
3.2 Gson的实现
3.2.1 Gson值类型
3.2.2 Gson核心类
3.2.3 Gson生成JSON原理
3.2.4 TypeAdapter
3.2.5 Gson解析JSON原理
3.2.6 Gson应用示例
3.2.7 Gson特性
3.3 开源工具库介绍
3.3.1 Fastjson
3.3.2 Jackson
3.3.3 开源工具库对比
3.4 小结
第4章 Thrift
4.1 Thrift数据类型
4.1.1 基本数据类型
4.1.2 复杂数据类型
4.2 Thrift文件
4.2.1 Thrift规范
4.2.2 名字空间
4.2.3 include关键字
4.2.4 const关键字
4.3 Thrift文件示例
4.4 Thrift生成的数据结构
4.4.1 enum生成Java代码
4.4.2 struct生成Java代码
4.5 Thrift序列化原理
4.5.1 序列化/反序列化核心类
4.5.2 序列化流程
4.5.3 反序列化流程
4.6 TProtocol的实现
4.6.1 TBinaryProtocol
4.6.2 TCompactProtocol
4.6.3 TJSONProtocol
4.6.4 TSimpleJSONProtocol
4.6.5 TTupleProtocol
4.7 Java Serializable读写Thrift对象
4.8 TTransport
4.8.1 内存型TTransport
4.8.2 文件型TTransport
4.8.3 特定功能型TTransport
4.8.4 网络型TTransport
4.8.5 总结
4.9 小结
第5章 Protocol Buffer
5.1 数据类型
5.1.1 基本数据类型
5.1.2 复杂数据类型
5.2 proto文件
5.2.1 proto规范
5.2.2 import关键字
5.3 proto文件示例
5.4 proto文件生成代码
5.4.1 手动执行protoc命令行
5.4.2 Maven集成方式
5.4.3 proto应用示例
5.4.4 proto生成的代码文件
5.5 ProtoBuf生成Java对象
5.5.1 enum定义生成的Java对象
5.5.2 message定义生成的Java对象
5.6 Descriptor机制
5.6.1 FileDescriptor
5.6.2 PackageDescriptor
5.6.3 Descriptor
5.6.4 FieldDescriptor
5.6.5 OneOfDescriptor
5.6.6 EnumDescriptor和EnumValueDescriptor
5.6.7 ServiceDescriptor和MethodDescriptor
5.6.8 Descriptor和DescriptorProto
5.6.9 Descriptor文件
5.7 ProtoBuf Builder机制
5.8 ProtoBuf数据序列化
5.8.1 数据序列化大小
5.8.2 数据序列化实现方式
5.8.3 ProtoBuf序列化流程
5.8.4 ProtoBuf序列化应用示例
5.9 ProtoBuf数据反序列化
5.10ProtoBuf高级特性
5.10.1 extension
5.10.2 oneof
5.10.3 Any
5.11 ProtoBuf开源组件
5.11.1 protostuff
5.11.2 Cap‘n Proto
5.12小结
第6章 Avro
6.1 Avro数据Schema
6.1.1 Avro数据类型
6.1.2 Avro Schema文件定义
6.1.3 Avro Schema文件的生效模式
6.2 Avro生成Java代码
6.3 Avro序列化核心类
6.3.1 Schema
6.3.2 GenericData
6.3.3 Encoder
6.3.4 Decoder
6.3.5 DatumWriter
6.4 Avro序列化过程
6.5 小结 195
第三部分 深入理解序列化技术
第7章 序列化技术性能
7.1 序列化技术特征对比
7.2 序列化技术性能对比
7.2.1 对各类型数据的处理
7.2.2 序列化数据大小对比
7.2.3 序列化耗时对比
7.2.4 反序列化耗时对比
7.2.5 性能对比结论
7.3 自定义IDL序列化工具
7.4 小结
温馨提示:请使用泸西县图书馆的读者帐号和密码进行登录
董西成•快手数据平台部数据工厂负责人
数据序列化是分布式领域非常重要的基础技术,本书比较全面地介绍了序列化技术的基本概念、技术实现及内部原理,很值得一读。
曾剑锋•深圳市瑞能实业股份有限公司软件研发总监
本书从最基本的计算机编码讲起,接着讲解目前互联网常用的序列化/反序列化技术的原理,再辅之以应用示例,帮助读者更好地进行理解,最后总结这些技术的优缺点、性能优劣。整本书读下来,可以看出作者的用心良苦和扎实的技术功底,能把一个细分的技术讲得这么细、这么深,实属难得。强烈推荐在序列化/反序列化方面有苦恼或者想深入了解的读者阅读这本书,它一定会给你带来系统和完整的知识结构。
谭金军•腾讯天美工作室群高级工程师
本书先介绍了各种基础编码方式,再循序渐进地介绍了序列化/反序列化的底层原理及应用。我可以肯定的是:认真读完本书,如果你是位“新手”,你将对序列化/反序列化有较全面的认识;如果你是位“老手”,你将会有更深刻的理解。本书作者是引领我进入计算机世界的良师益友,他学习计算机技术的思路对我的职业生涯产生了很大的影响。看完本书后,我发现其架构与作者的学习思路非常相似,相信这会对想了解序列化技术的读者有非常大的帮助!
胡伟•快手主App客户端架构师
对于程序员来说,与序列化相关的工作可以说是非常熟悉和神秘的,因为序列化本质上是一种数据编码工作,所以本书从计算机编码知识开始进行详细介绍,让读者对序列化的理解更加容易,然后对业界主流的5种序列化技术进行深入讲解,从内部机制、工作原理、核心类剖析到应用示例,让读者对序列化知识有更全面和深入的理解,从而更好地应对不同场景下的序列化需求。对程序员而言,这是一本很实用的书。
章碧云•快手平台研发部技术专家
互联网数据存储和网络通信都依赖于数据序列化和反序列化。本书是我见过的第一本系统、全面地介绍序列化和反序列化技术的著作,从底层字节编码原理到互联网广泛应用的序列化技术,都进行了详细的分析和讲解。相信阅读本书,可以让你更加深入地理解序列化和反序列技术,并将其应用到日常的开发中。
叶邦宇•快手用户增长部架构师
序列化和反序列化是后端开发中非常基础和底层的技术,也是微服务架构里必不可少的组成部分,业内有多种方案,纷繁杂乱,本书对其做了非常全面的梳理和介绍,颇值得一读。
王永•资深互联网技术从业者
本书全面系统地梳理了序列化和反序列化技术的知识结构,使读者能够全面地学习并深刻理解相关知识。整本书通俗易懂,由浅入深,既有广度又有深度,是一本难得的学习序列化和反序列化知识的教材。
岳京杭•知名公众号“中产之路”作者
通过个人公众号“中产之路”的牵线,我把洪安推荐给了编辑牛老师,也算为促成本书的出版做出了一点贡献。本书的切入点是一个横向主题,以“点-线-面”的方式全面阐述了序列化技术,从浅入深,从why 到 how,值得深读,也可以作为工具书翻阅。