首页 > 其他分享 >序列化 - Kryo序列化详解

序列化 - Kryo序列化详解

时间:2023-08-14 13:13:42浏览次数:48  
标签:kryo SomeClass Kryo 详解 new 序列化 class

什么是序列化

序列化是指将数据结构或对象转换为可存储或传输的格式,以便在稍后的时间点重新构建或恢复原始数据结构或对象的过程。在计算机科学和编程中,序列化通常用于将内存中的数据转换为可以在磁盘上保存或通过网络传输的形式,以便在需要时进行持久化存储或在不同系统之间进行数据交换。

序列化的主要目的是在不同的环境中传递数据,无论是在不同的程序之间、不同的计算机之间,甚至在不同的编程语言之间。序列化的结果通常是一串字节流或文本,这取决于所使用的序列化格式。

大白话介绍下RPC中序列化的概念,可以简单理解为对象-->字节的过程,同理,反序列化则是相反的过程。为什么需要序列化?因为网络传输只认字节。所以互信的过程依赖于序列。

jdk序列化

实体类需要实现Serializable接口,以告知其可被序列化

class Student implements Serializable{  
   private String name;  
}  

class Main{
   public static void main(String[] args) throws Exception{  
      // create a Student
      Student st = new Student("kirito");  
     // serialize the st to student.db file  
     ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("student.db"));  
     oos.writeObject(st);  
     oos.close();  
     // deserialize the object from student.db
     ObjectInputStream ois = new ObjectInputStream(new FileInputStream("student.db"));  
     Student kirito = (Student) ois.readObject();  
     ois.close();  
    // assert
    assert "kirito".equals(kirito.getName());  
   }  
}

kryo序列化

kryo号称Java中最快的序列化框架,kryo是一个高性能的序列化/反序列化工具,由于其变长存储特性并使用了字节码生成机制,拥有较高的运行速度和较小的体积。

特点:

  1. 序列化的性能非常高
  2. 序列化结果体积较小
  3. 提供了简单易用的API
    记录类型信息
    这算是kryo的一个特点,可以把对象信息直接写到序列化数据里,反序列化的时候可以精确地找到原始类信息,不会出错,这意味着在写readxxx方法时,无需传入Class或Type类信息。

相应的,kryo提供两种读写方式。记录类型信息的writeClassAndObject/readClassAndObject方法,以及传统的writeObject/readObject方法。

引入依赖

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

基础使用

public class HelloKryo {
   static public void main(String[] args) throws Exception {
       Kryo kryo = new Kryo();
       kryo.register(SomeClass.class);
​
       SomeClass object = new SomeClass();
       object.value = "Hello Kryo!";

       Output output = new Output(new FileOutputStream("file.bin"));
       kryo.writeObject(output, object);
       output.close();
​
       Input input = new Input(new FileInputStream("file.bin"));
       SomeClass object2 = kryo.readObject(input, SomeClass.class);
       input.close();
       System.out.println(object2.value);
  }
​
   static public class SomeClass {
       String value;
  }
}

1.Kryo的IO

Kryo致力以简单易用的API,序列化过程中主要核心有Kryo、Output、Input。

Output和Input是Kryo的IO,他们支持以byte array或者stream的形式为序列化的dest和反序列化的source。当使用stream形式进行写出写入时,需要close这些Output和Input。

写出时,当OutputDe buffer是满的时候,就会flush bytes到stream中。写入时,会从stream中获取bytes到Input buffer中,当填充满时,进行反序列化。

2.Kryo的注册

和很多其他的序列化框架一样,Kryo为了提供性能和减小序列化结果体积,提供注册的序列化对象类的方式。在注册时,会为该序列化类生成int ID,后续在序列化时使用int ID唯一标识该类型。

注册的方式如下:

kryo.register(SomeClass.class);

或者

kryo.register(SomeClass.class, 1);

可以明确指定注册类的int ID,但是该ID必须大于等于0。如果不提供,内部将会使用int++的方式维护一个有序的int ID生成。

标签:kryo,SomeClass,Kryo,详解,new,序列化,class
From: https://www.cnblogs.com/yangyezhuang/p/17628335.html

相关文章

  • 序列化 - jdk序列化详解
    当谈到在Java中将对象转换为字节流以便于存储、传输或持久化时,不可避免地会涉及到JDK序列化。JDK序列化是Java编程语言提供的一种机制,允许开发者将对象转换为字节序列,以便在稍后的时间点能够重新构建或恢复对象的状态。本文将深入介绍JDK序列化的概念、用法以及一些相关的......
  • Linux权限详解
    一、文件、目录权限和所有者简介:用户对一个文件或目录具有访问权限,这些访问权限决定了谁能访问,以及如何访问这些文件和目录。通过设置权限可以限制或允许以下三种用户访问:文件的用户所有者(属主)文件的组群所有者(用户所在组的同组用户)系统中的其他用户在linux系统中,每一位用户都有对......
  • Linux-wget命令使用及参数详解
    wget简介Linux系统中的wget是一个下载文件的工具,它用在命令行下。对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。wget支持HTTP,HTTPS和FTP协议,可以使用HTTP代理。所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意......
  • Webpack 使用详解
    Webpack是一个现代JavaScript应用程序的静态模块打包器。本文将详细介绍如何使用Webpack,以及提供代码示例。为了保持篇幅,我们将简要介绍Webpack的核心概念和功能。一、核心概念入口(entry):应用程序的起点。输出(output):打包后资源的输出位置。加载器(loader):将非JavaScript文......
  • docker swarm 使用详解
    转载请注明出处:1.dockerswarm的组成架构一个基本的dockerswarm的架构如下:它主要包含这几个核心组件:Manager节点(ManagerNodes):管理节点是Swarm集群的控制中心,负责整个集群的管理和调度。Swarm可以有一个或多个Manager节点,其中一个被选举为Leader,负责领导整......
  • 水果编曲软件FL Studio 21.1.0.3267音频工作站2023电脑配置要求详解
    FL全称为FruityLoops,FLStudio更倾向于DJ混音和编辑。但这并不意味着它缺乏功能!FLStudio21是一个受欢迎的插件,如果购买了制作版本,那么这个软件就可以终身更新。为音乐制作和音频编辑选择硬件FLStudio21Win-安装包:https://souurl.cn/ZIwzHsFLStudio21Mac-安装包:https://sou......
  • CCLINK IE 转MODBUS-RTU网关modbusrtu功能码详解
    远创智控YC-CCLKIE-RTU。这款产品的主要功能是将各种MODBUS-RTU、RS485、RS232设备接入到CCLINKIEFIELDBASIC网络中。那么,这款通讯网关又有哪些特点呢?首先,它能够连接到CCLINKIEFIELDBASIC总线中作为从站使用,同时也能连接到MODBUS-RTU、RS485、RS232总线中作为主站或从站使......
  • 数据序列化工具Protobuf编码&避坑指南
    我们现在所有的协议、配置、数据库的表达都是以protobuf来进行承载的,所以我想深入总结一下protobuf这个协议,以免踩坑。先简单介绍一下ProtocolBuffers(protobuf),它是Google开发的一种数据序列化协议(与XML、JSON类似)。它具有很多优点,但也有一些需要注意的缺点:优点:效......
  • Dubbo高手之路2,6种扩展机制详解
    大家好,我是哪吒。上一篇分享了Java面试被问到Dubbo,怎么回答可以得高分?今天详细的分解一下Dubbo的扩展机制,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。三分钟你将学会:Dubbo的自适应扩展机制Dubbo的SPI扩展机制Dubbo的自定义扩展点机制Dubbo......
  • SAP ABAP 报表进度显示控件的使用详解试读版
    有些SAPABAP报表包含了多个业务处理步骤,笔者这里举一个例子:计算某个时间段内,系统所有销售订单的总金额。SAP大多数基于ABAP技术栈的销售订单设计,都是采取订单抬头(header)和订单行项目(LineItem)的数据结构。订单的时间段维护在抬头结构上,一张订单可能包含多个行项目,每......