kryo: Java对象序列化框架

/ Java / 没有评论 / 138浏览

Kryo是一种快速高效的Java对象图(Object graph)序列化框架
Kryo还可以执行自动深层浅层的复制/克隆。这是从对象直接复制到对象,而不是object-> bytes-> object。

Kryo序列化机制比默认的Java序列化机制速度要快,序列化后的数据要更小,大概是Java序列化机制的1/10。所以Kryo序列化优化以后,可以让网络传输的数据变少,在集群中耗费的内存资源大大减少。

quickstart

  public static void main(String[] args) throws FileNotFoundException {
        Kryo kryo = new Kryo();
        Output output = new Output(new FileOutputStream("file.bin"));
        kryo.writeObject(output,new User(1) );
        output.close();
        Input input = new Input(new FileInputStream("file.bin"));
        User user = kryo.readObject(input, User.class);
        input.close();
    }

注册

kryo序列化一个对象时,需要写入用于识别对象的标识,默认情况下是写入完整类名,为了提高性能可以事先注册类名,这样就用一个整数作为类的ID:

kryo.register(SomeClass.class);//默认ID从10开始
kryo.register(SomeClass.class,10);

kryo.setRegistrationRequired(true);

当 IDs 是小的正整数时最有效。负数不能有效地序列化。 -1 和 -2 是保留值。默认使用 ID 0-9 注册所有基本类型,基本类包装器,String 和 void.
kryo可以注册序列化器

kryo.register(Color.class, new ColorSerializer ());

public class ColorSerializer extends Serializer<Color> {
   public void write (Kryo kryo, Output output, Color color) {
      output.writeInt(color.getRGB());
   }

   public Color read (Kryo kryo, Input input, Class<? extends Color> type) {
      return new Color(input.readInt());
   }
}

或注解

    @DefaultSerializer(SomeClassSerializer.class)
    public class SomeClass {
       // ...
    }

Serializer

默认情况下,大多数类最终会使用 FieldSerializer。 它本质上是自动化的处理了手动的序列化过程。

类也可以方便地进行自己的序列化,需要实现 KryoSerializable 接口

 public class SomeClass implements KryoSerializable {
       // ...
       public void write (Kryo kryo, Output output) {
          // ...
       }
       public void read (Kryo kryo, Input input) {
          // ...
       }
    }

有一些类不能被 Kryo 序列化,可以使用 Kryo 的 JavaSerializer 提供后备解决方案,并使用标准Java序列化。

kryo.register(SomeClass.class, new JavaSerializer());//类实现了 Java 的 Serializable 接口
kryo.register(SomeClass.class, new ExternalizableSerializer());//类实现了Java的 Externalizable 接口