首页 > 其他分享 >Kryo深拷贝工具

Kryo深拷贝工具

时间:2024-12-13 13:57:07浏览次数:6  
标签:kryo 对象 Kryo new 拷贝 序列化 工具

优质博文:IT-BLOG-CN

一、工具介绍

Kryo 是一个快速高效的 Java 二进制对象图序列化框架。 该项目的目标是高速、小尺寸和易于使用的 API。 该项目在需要持久化对象的任何时候都很有用,无论是文件、数据库还是通过网络。

github地址:https://github.com/EsotericSoftware/kryo

二、使用方法

1 引入kryo工具依赖

<dependency>
    <groupId>com.esotericsoftware</groupId>
    <artifactId>kryo</artifactId>
    <version>5.3.0</version>
</dependency>

2 快速开始
使用下面的代码,可以简单进行对象的深拷贝

public static <T> T kryoCopy(T origin) {
    Kryo kryo = new Kryo();
    kryo.setRegistrationRequired(false);
    return kryo.copy(origin);
}

使用下面的代码,可以简单进行对象序列化和反序列化

public static <T> Output kryoSerialize(T origin) {
    Kryo kryo = new Kryo();
    Output output = new Output();
   kryo.setRegistrationRequired(false);
    kryo.writeObject(output, origin);
   return output;
}
public static <T> T kryoDeserialize(Input input, Class<T> clazz) {
    try {
        return kryo.readObject(input, clazz);
    } catch (Exception e) {
        log.error("Deserialize Error", e);
        return null;
    }
}

三、相关配置

3.1 通用配置
Kryo在拷贝对象前需要先对该类进行注册,包括该对象中使用到的其他类,注册后的对象拷贝速度更快。

kryo.register(T.class);

对于复杂对象,或是其他无法注册完全的对象,可以用以下代码跳过注册

kryo.setRegistrationRequired(false);

Kryo提供了许多序列化器供使用,每个都有各自的作用,具体可以看github上的文档。Kryo使用注册的方式支持对于不同的类使用不同的序列化器。如下所示:

kryo.register(T.class, new FieldSerializer<>(kryo, T.class));
kryo.register(R.class, new TaggedFieldSerializer<>(kryo, R.class));

3.2 FieldSerializer
FieldSerializer对于拷贝的配置如下所示:

配置项描述默认值
copyTransient如果为true,那么transient修饰字段也会被拷贝true
可以通过FieldSerializerFactory修改配置,使用方法如下:
SerializerFactory.FieldSerializerFactory serializerFactory = new SerializerFactory.FieldSerializerFactory();
serializerFactory.getConfig().setCopyTransient(false);
kryo.setDefaultSerializer(serializerFactory);

3.3 TaggedFieldSerializer
TaggedFieldSerializer继承FieldSerializer,对于拷贝无额外配置项。同样可以通过TaggedFieldSerializerFactory修改配置,使用方法如下:

SerializerFactory.TaggedFieldSerializerFactory tagSerializerFactory = new SerializerFactory.TaggedFieldSerializerFactory();
tagSerializerFactory.getConfig().setCopyTransient(false);
kryo.setDefaultSerializer(serializerFactory);

四、并发处理

Kryo提供Pool类用于并发处理,使用过程中需要先创建Kryo池,池的容量表示用于存储的最大对象数,但是同时获取的数量可以超过池的最大容量:

// 构造器参数分别为thread safe, soft references, maximum capacity
Pool<Kryo> KRYO_POOL = new Pool<Kryo>(true, false, 64) {
    @Override
    protected Kryo create() {
        Kryo kryo = new Kryo();
        // 配置Kryo
        return kryo;
    }
};

然后在使用时先从Pool中获取Kryo对象,并在完成拷贝后(无论是否成功)务必归还:

Kryo kryo = KRYO_POOL.obtain();
try {
    return kryo.copy(origin);
} catch (Exception e) {
    log.error("Deep Copy", e);
    throw new RuntimeException("kryo copy fail!", e);
} finally {
    // 一定要归还
    KRYO_POOL.free(kryo);
}处理序列化对象时,可以创建一个Pool中的泛型类改为Output的池

五、性能测试

深拷贝

1.1 JMH性能对比
分别对Hotel对象(0)、小ListSearchResponse对象(1)、大ListSearchResponse对象(2)进行了多轮深拷贝测试。
JMH配置为单线程、迭代10次取平均值,具体如下所示:

@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 3, time = 1)
@Measurement(iterations = 10, time = 5)
@Fork(1)
@State(value = Scope.Benchmark)
@OutputTimeUnit(TimeUnit.NANOSECONDS) 

每次迭代需要循环1000次多轮拷贝。

测试结果如下图所示,其中testCopy是用ProtostuffSerializer进行序列化,反序列化来深拷贝。从结果可以发现,Kryo的深拷贝时间相较于ProtostuffSerializer平均缩短了50-60%。
在这里插入图片描述

1.2 线上性能对比
左图为深拷贝平均耗时(单位毫秒),右图为kryo相较于protostuff的变化幅度,可以发现kryo平均缩短了30-40%的拷贝时间
在这里插入图片描述

序列化

测试对象与深拷贝测试中的相同,分别测试了Protostuff序列化、Kryo序列化、以及他们各自加上zstd压缩的序列化性能

2.1 序列化
下图是序列化性能测试结果,可以发现Kryo序列性能更好,对象越大,Kryo优势就更明显
在这里插入图片描述

2.2 反序列化
下图是序列化+反序列化性能测试结果,可以发现Kryo序列性能更好,对象越大,Kryo优势就更明显
在这里插入图片描述
在这里插入图片描述

标签:kryo,对象,Kryo,new,拷贝,序列化,工具
From: https://blog.csdn.net/zhengzhaoyang122/article/details/144333263

相关文章

  • Node.js:后端开发的强大工具
    ......
  • Windows Server 上使用 命令行 工具来实现 简单的同步功能、轻量级,并且能够定义 同步
    为了自动同步本地文件到文件服务器,且要求工具简单、轻量级,您可以选择以下几种常见工具,这些工具都能提供简单易用的界面和配置方式,帮助您定义同步目录和同步策略。WindowsServer上使用命令行工具来实现简单的同步功能、轻量级,并且能够定义同步目录和同步策略,我推荐以下几种......
  • 网络通信与状态管理:深入理解Cookie、Session及Web工具
    前言:在当今数字化的网络世界中,Web技术的基石构建起了我们丰富多彩的互联网体验。其中,Cookie和Session犹如隐匿于幕后的关键使者,默默地在客户端与服务器之间传递着信息,管理着用户的状态与交互数据,深刻影响着我们在各类网站与应用中的每一次操作与交互流程。与此同时,Links、Wge......
  • SQL 在线格式化 - 加菲工具
    SQL在线格式化打开网站加菲工具选择“SQL在线格式化”或者直接访问https://www.orcc.online/tools/sql输入sql,点击上方的格式化按钮即可输入框得到格式化后的sql结果......
  • 为什么局域网协作工具是大数据时代的必需品?
    局域网文档协同编辑的技术解析与优势在数字化转型加速的今天,企业和团队对文档协同编辑工具的需求与日俱增。特别是在局域网环境下,实现高效、实时的文档协同编辑,不仅能够提升团队的工作效率,还能显著增强信息安全性。本文将从技术原理、实践应用以及市场趋势等多方面,探讨局域网文档......
  • chrome开发者工具网络过滤
    在Chrome开发者工具的网络(Network)选项卡中,你可以使用多种过滤条件来筛选网络请求。以下是一些常用的过滤条件:domain:过滤特定域名的请求,例如domain:example.com。method:过滤特定HTTP方法的请求,例如method:GET。status-code:过滤特定HTTP状态码的请求,例如status-c......
  • ChatGPT Canvas重大升级:AI内容创作与代码调试的终极工具
    引言OpenAI在“12天的OpenAI”系列活动的第四天宣布了ChatGPTCanvas的重大更新,这一里程碑式的升级将功能扩展至所有ChatGPT用户,显著提升了生产力与代码开发效率。这一更新显著提升了用户的生产力与工作流程效率,新增的多项功能使Canvas成为一个集文本编辑、代码调试和自定......
  • 微信聊天快捷回复工具
    易歪歪是一款可以应付各种场景下聊天快捷回复工具,相对强大的客服聊天助手,支持话术存储,软件用于提升客服聊天效率,高标准统一迅捷回复,达到一名客服效率为五名的效益转化。软件特点一键发送话术,少打字,回复快支持图文视频文件,客服快速回复的神器,高效率接待智能吸附聊天窗口......
  • 微信聊天快捷回复工具
    易歪歪是一款可以应付各种场景下聊天快捷回复工具,相对强大的客服聊天助手,支持话术存储,软件用于提升客服聊天效率,高标准统一迅捷回复,达到一名客服效率为五名的效益转化。软件特点一键发送话术,少打字,回复快支持图文视频文件,客服快速回复的神器,高效率接待智能吸附聊天窗口......
  • 微信聊天快捷回复工具
    易歪歪是一款可以应付各种场景下聊天快捷回复工具,相对强大的客服聊天助手,支持话术存储,软件用于提升客服聊天效率,高标准统一迅捷回复,达到一名客服效率为五名的效益转化。软件特点一键发送话术,少打字,回复快支持图文视频文件,客服快速回复的神器,高效率接待智能吸附聊天窗口......