请教几个关于Kryo的问题

Ellipse 发布于 2014/12/30 15:44
阅读 1K+
收藏 0

在做一个JavaFX程序,需要实现一个深度拷贝,考虑用序列化和反序列化来做。由于JavaFXBean里包含javafx properties成员,这些类是没有实现Serializable接口的,因此Java序列化和FST都无法使用。发现Kyro(3.0)可以。问题如下

(1)看到有人说每个类都要注册 kryo.register(class),为什么?我不注册也能用。

(2)注册Serializer下面两种方式的区别是什么?我用的第二种

kryo.register(OffsetDateTime.class, new MyOffsetDateTimeSerializer());
kryo.addDefaultSerializer(OffsetDateTime.class, MyOffsetDateTimeSerializer.class);

(3)下面两种序列化的写法的区别是什么?为什么说不注册就必须用第二种?

kryo.writeObject(output, t);
kryo.writeClassAndObject(output, t);


附上深度克隆代码

public class KryoUtils {
    private static Logger LOGGER = LoggerFactory.getLogger(KryoUtils.class);
    private static ThreadLocal<Kryo> kryoLocal = new ThreadLocal<Kryo>() {
        @Override
        protected Kryo initialValue() {
            Kryo kryo = new Kryo();
            kryo.addDefaultSerializer(OffsetDateTime.class, KryoOffsetDateTimeSerializer.class);
            return kryo;
        }
    };

    @SuppressWarnings(value = "unchecked")
    public static <T> T deepClone(T t) {
        Kryo kryo = kryoLocal.get();
        try (Output output = new Output(new ByteArrayOutputStream())) {
            kryo.writeObject(output, t);
            try (Input input = new Input(output.getBuffer())) {
                return kryo.readObject(input, (Class<T>) t.getClass());
            }
        } catch (Exception e) {
            LOGGER.error("深度克隆失败", e);
        }
        return null;
    }
}




加载中
返回顶部
顶部