当前位置: 首页 > news >正文

kryo浅析

kryo浅析

简介

Kryo is a fast and efficient object graph serialization framework for Java. The goals of the project are speed, efficiency, and an easy to use API. The project is useful any time objects need to be persisted, whether to a file, database, or over the network.
– https://github.com/EsotericSoftware/kryo

总结点

  1. 其使用了字节码生成机制(底层依赖了 ASM 库)
  2. 必须包含无参构造器
  3. 不需要实现Serializable接口
  4. Kryo是线程不安全的,意味着每当需要序列化和反序列化时都需要实例化一次,或者借助ThreadLocal来维护以保证其线程安全。
  5. 使用 transient 关键字标记的字段不参与序列化

简单实践

maven依赖

        <dependency>
            <groupId>com.esotericsoftware</groupId>
            <artifactId>kryo</artifactId>
            <!--<artifactId>kryo-shaded</artifactId>-->
            <version>4.0.2</version>
        </dependency>
@Data
public class User2 {

    private Long id;
    private String name;
    private Date date;
    private transient String str;
}
package morning.cat.study.kryo;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.pool.KryoPool;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.concurrent.ArrayBlockingQueue;

public class KryoSerializableTest {

    @Test
    public void test() throws IOException {
        // 序列化
        Kryo kryo = new Kryo();
        Output output = new Output(new FileOutputStream("kryo.bin"));
        kryo.writeObject(output, getUser());
        output.close();
    }

    @Test
    public void test2() throws IOException {
        // 反序列化
        Kryo kryo = new Kryo();
        Input input = new Input(new FileInputStream("kryo.bin"));
        User2 user = kryo.readObject(input, User2.class);
        System.out.println(user);
    }

    private User2 getUser() {
        User2 user = new User2();
        user.setId(System.currentTimeMillis());
        user.setName("Kryo_" + System.currentTimeMillis());
        user.setDate(Calendar.getInstance().getTime());
        user.setStr("transient 关键字标记 不参与序列化");
        System.out.println(user);
        return user;
    }

    private static final ThreadLocal<Kryo> kryos =
            new ThreadLocal<Kryo>() {
                @Override
                protected Kryo initialValue() {
                    Kryo kryo = new Kryo();
                    return kryo;
                }
            };

    @Test
    public void test3() throws FileNotFoundException {

        String fileName = "kryo_test3_3.bin";

        // ThreadLocal 方式
        Kryo kryo = kryos.get();
        kryo.setRegistrationRequired(false);//关闭注册行为
        kryo.setReferences(true);//支持循环引用
        Output output = new Output(new FileOutputStream(fileName));
        kryo.writeClassAndObject(output, getUser());
        output.close();

        Input input = new Input(new FileInputStream(fileName));
        Object object = kryo.readClassAndObject(input);
        if (object instanceof User2) {
            User2 user = (User2) object;
            System.out.println(user);
        }
    }


    @Test
    public void test4() {
        // 池技术
        KryoPool kryoPool = new KryoPool.Builder(() -> new Kryo()).queue(new ArrayBlockingQueue<>(20)).build();
        Kryo kryo = kryoPool.borrow();


        kryoPool.release(kryo);
    }


}

附录

参考文档:
http://www.iocoder.cn/RPC/laoxu/rpc-serialize-1/?geekbook

https://github.com/EsotericSoftware/kryo

相关文章:

  • 六招彻底防范ARP病毒反复发作
  • 转载:面试前必须要知道的Redis面试题
  • 如何检测网内IP地址是否被占用
  • 转载:Java并发编程-原子类实现
  • Java 中的四种引用类型
  • 美国国家安全局在监视全球网民?
  • 评论:微软的SOA战略
  • SpringBoot 以字符串格式传入时间
  • 基于JAVA的开源工作流引擎(Open Source Workflow Engines Written in Java)
  • SpringBoot WebFlux 官网文档阅读笔记
  • 拿到好牌就出昏招——郝玺龙妙语录
  • 关于 SkipList (跳表)的一些资料梳理
  • 重构的修炼——从重构命令行操作的实践来谈论
  • Feign的简单实践
  • JPA:好与坏?常见问题解答
  • ----------
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • flutter的key在widget list的作用以及必要性
  • IDEA 插件开发入门教程
  • Python打包系统简单入门
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Vim Clutch | 面向脚踏板编程……
  • 创建一种深思熟虑的文化
  • 第2章 网络文档
  • 聊聊redis的数据结构的应用
  • 你真的知道 == 和 equals 的区别吗?
  • 扑朔迷离的属性和特性【彻底弄清】
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何使用 JavaScript 解析 URL
  • 时间复杂度与空间复杂度分析
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • python最赚钱的4个方向,你最心动的是哪个?
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • (2)nginx 安装、启停
  • (初研) Sentence-embedding fine-tune notebook
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (实战篇)如何缓存数据
  • (一)基于IDEA的JAVA基础1
  • (转)创业的注意事项
  • ***利用Ms05002溢出找“肉鸡
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net的DataSet直接与SQL2005交互
  • .NET框架
  • .NET序列化 serializable,反序列化
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @hook扩展分析
  • @NestedConfigurationProperty 注解用法
  • @reference注解_Dubbo配置参考手册之dubbo:reference