自定义序列化器
本页介绍如何为你的类型实现自定义序列化器。
基本自定义序列化器
在某些情况下,你可能想为你的类型实现序列化器,特别是对于使用 JDK writeObject/writeReplace/readObject/readResolve 自定义序列化的类,这非常低效。
例如,如果你不想调用以下 Foo#writeObject,你可以实现自定义序列化器:
class Foo {
public long f1;
private void writeObject(ObjectOutputStream s) throws IOException {
System.out.println(f1);
s.defaultWriteObject();
}
}
class FooSerializer extends Serializer<Foo> {
public FooSerializer(Fory fory) {
super(fory, Foo.class);
}
@Override
public void write(MemoryBuffer buffer, Foo value) {
buffer.writeInt64(value.f1);
}
@Override
public Foo read(MemoryBuffer buffer) {
Foo foo = new Foo();
foo.f1 = buffer.readInt64();
return foo;
}
}
注册序列化器
Fory fory = getFory();
fory.registerSerializer(Foo.class, new FooSerializer(fory));
除了注册序列化器,你还可以为类实现 java.io.Externalizable 来自定义序列化逻辑。这种类型将由 Fory 的 ExternalizableSerializer 序列化。
集合序列化器
在为自定义集合类型实现序列化器时,你必须扩展 CollectionSerializer 或 CollectionLikeSerializer。主要区别是 CollectionLikeSerializer 可以序列化具有类似集合结构但不是 Java Collection 子类型的类。