import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.util.Pool;
import common.RpcRequest;
import common.RpcResponse;
import lombok.extern.slf4j.Slf4j;
import serializer.CommonSerializer;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@Slf4j
public class KryoSerializer implements CommonSerializer {
private static final ThreadLocal<Kryo> kyroThreadLocal = ThreadLocal.withInitial(() ->{
Kryo kryo = new Kryo();
kryo.register(RpcRequest.class);
kryo.register(RpcResponse.class);
kryo.setReferences(true);
kryo.setRegistrationRequired(false);
return kryo;
});
private static final Pool<Kryo> kryoPool = new Pool<Kryo>(true,false,10) {
@Override
protected Kryo create() {
Kryo kryo = new Kryo();
kryo.register(RpcRequest.class);
kryo.register(RpcResponse.class);
// kryo.setReferences(true);
kryo.setRegistrationRequired(false);
return kryo;
}
};
@Override
public byte[] serialize(Object o) {
Kryo kryo = null;
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
Output output = new Output(byteArrayOutputStream
)
) {
kryo = kryoPool.obtain();
kryo.writeObject(output, o);
return output.toBytes();
} catch (IOException e) {
log.error("序列化失败",e);
return new byte[0];
}finally {
kryoPool.free(kryo);
}
}
@Override
public Object deserialize(byte[] bytes, Class<?> clazz) {
Kryo kryo = null;
try(ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
Input input = new Input(byteArrayInputStream)) {
kryo = kryoPool.obtain();
Object o = kryo.readObject(input, clazz);
return o;
} catch (IOException e) {
log.error("反序列化失败",e);
return null;
}finally {
kryoPool.free(kryo);
}
}
}
基于Kryo自定义序列化器
最新推荐文章于 2024-09-03 09:06:10 发布
本文探讨了在Java开发中如何利用Kryo库创建自定义序列化器,以提升对象序列化和反序列化的效率。通过自定义序列化策略,可以优化内存占用并加快数据传输速度。
413

被折叠的 条评论
为什么被折叠?



