用户工具


为什么需要序列化

因为最终数据都是以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的代码写的。