我使用以下代码为Kryo反序列化添加钩子。
private static class KryoWithHooks extends Kryo {
private static final class SerializerWithHook extends com.esotericsoftware.kryo.Serializer {
private final com.esotericsoftware.kryo.Serializer old;
private final Hook hook;
private SerializerWithHook(com.esotericsoftware.kryo.Serializer old, Hook hook) {
this.old = old;
this.hook = hook;
}
@Override
public Object read(Kryo kryo, Input input, Class type) {
hook.preRead(type);
return hook.postRead(old.read(kryo, input, type));
}
@Override
public void write(Kryo kryo, Output output, Object object) {
// Add write hooks if needed.
old.write(kryo, output, object);
}
}
public void addHook(Class<?> k, Hook h) {
register(k, new SerializerWithHook(newDefaultSerializer(k), h));
}
}
}
然后我在注册所有显式类后添加钩子。 到现在为止还挺好。 问题是,如果我事先不了解班级,并且只知道基类,我该如何做同样的事情呢?即我有
class Container {
private Contained c;
}
包含可以有任意数量的子类,我想在实例化之前拦截它的反序列化/。如果我为上面的Contained.class添加钩子,那就不会被调用(可以理解),即使是例如容器工作正常。