===== 为什么需要序列化 =====
因为最终数据都是以byte[]数组的方式存在的。网络io,存储等都是面向byte[]
===== 学习序列化带来的好处 =====
* 优化存储大小
* 提高反序列化的速度
* 通过自定义序列化方式,实现即使不反序列也能对关心的数据部分进行操作
===== 序列话常用技巧 =====
* 使用varint (啥意思,查百度)
* 如:小于127的数字只需要一个byte存储
* varint的算法,可以参考kryo的实现。com.esotericsoftware.kryo.io.Input, Output 类
* 对类,属性用数字编码
* 字符串,byte[]。 先记录长度,在记录数据
===== 反序列话常用技巧 =====
* 对字符串是否包含非ascii值区分
* 全是ascii的字符串调用这个构造方法:public String(byte ascii[], int hibyte, int offset, int count) {
* 因为不需要对byte[]进行编码,也不需要做数组copy,性能要好很多(亲测)
* 包含其他字符(如中文),使用new String(byte[])。没法优化
kryo内部已经有这个功能
===== 建议 =====
比较复杂的对象直接使用kryo序列化,因为他内部已经将上面说的这些点全部考虑了。本文就是参考kryo的代码写的。