===== 为什么需要序列化 ===== 因为最终数据都是以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的代码写的。