Kryo序列化及反序列化用法示例

Kryo 是一个快速高效的 Java 对象图形序列化框架,主要特点是性能、高效和易用。该项目用来序列化对象到文件、数据库或者网络。

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

样例代码地址:https://github.com/nettm/public

Kryo的序列化及反序列速度很快,据说很多大公司都在用。我在把对象序列化都转换成了字符串形式,是为了把对象存储到缓存中。我们日常项目中使用的数据形式包括对象、List、Set和Map,因此主要把这几种类型的数据进行了序列化及反序列化,支持对象中包含List、Set和Map。

首先在项目的pom文件中引入:

<dependency>
  <groupId>com.esotericsoftware</groupId>
  <artifactId>kryo-shaded</artifactId>
  <version>3.0.3</version>
</dependency>

代码KryoTest:

package com.nettm.serializable;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.codec.binary.Base64;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.serializers.CollectionSerializer;
import com.esotericsoftware.kryo.serializers.JavaSerializer;
import com.esotericsoftware.kryo.serializers.MapSerializer;
public class KryoTest {
  private long time;
  @BeforeTest
  public void beforeTest() {
    time = System.currentTimeMillis();
  }
  @AfterTest
  public void afterTest() {
    System.out.println(System.currentTimeMillis() - time);
  }
  @Test(invocationCount = 1, threadPoolSize = 1)
  public void testObject() {
    CustomItemDto val = new CustomItemDto();
    val.setId(Long.parseLong(String.valueOf(1)));
    val.setItemCode("");
    val.setItemDespositPrice(32.45);
    val.setItemMemo(null);
    val.setItemName("张金");
    val.setItemPrice(89.02);
    val.setSort(10);
    String a = serializationObject(val);
    CustomItemDto newValue = deserializationObject(a, CustomItemDto.class);
    Assert.assertEquals(val.getId(), newValue.getId());
  }
  @Test(invocationCount = 1, threadPoolSize = 1)
  public void testList() {
    List<CustomItemDto> lst = new ArrayList<CustomItemDto>();
    for (int i = 0; i < 10; i++) {
      CustomItemDto val = new CustomItemDto();
      val.setId(Long.parseLong(String.valueOf(i)));
      val.setItemCode("");
      val.setItemDespositPrice(32.45);
      val.setItemMemo(null);
      val.setItemName("张金");
      val.setItemPrice(89.02);
      val.setSort(10);
      lst.add(val);
    }
    String a = serializationList(lst, CustomItemDto.class);
    List<CustomItemDto> newValue = deserializationList(a,
        CustomItemDto.class);
    Assert.assertEquals(lst.size(), newValue.size());
  }
  @Test(invocationCount = 1, threadPoolSize = 1)
  public void testBean() {
    List<CustomCategoryDto> lst = new ArrayList<CustomCategoryDto>();
    for (int j = 0; j < 10; j++) {
      CustomCategoryDto dto = new CustomCategoryDto();
      dto.setCategoryCode("ABCD_001");
      dto.setCategoryName("呼吸系统");
      for (int i = 0; i < 10; i++) {
        CustomItemDto val = new CustomItemDto();
        val.setId(Long.parseLong(String.valueOf(i)));
        val.setItemCode("");
        val.setItemDespositPrice(32.45);
        val.setItemMemo(null);
        val.setItemName("张金");
        val.setItemPrice(89.02);
        val.setSort(10);
        dto.getCustomItemList().add(val);
      }
      for (int i = 0; i < 10; i++) {
        CustomItemDto val = new CustomItemDto();
        val.setId(Long.parseLong(String.valueOf(i)));
        val.setItemCode("");
        val.setItemDespositPrice(32.45);
        val.setItemMemo(null);
        val.setItemName("张金");
        val.setItemPrice(89.02);
        val.setSort(10);
        dto.getCustomItemSet().add(val);
      }
      for (int i = 0; i < 10; i++) {
        CustomItemDto val = new CustomItemDto();
        val.setId(Long.parseLong(String.valueOf(i)));
        val.setItemCode("");
        val.setItemDespositPrice(32.45);
        val.setItemMemo(null);
        val.setItemName("张金");
        val.setItemPrice(89.02);
        val.setSort(10);
        dto.getCustomItemMap().put(String.valueOf(i), val);
      }
      lst.add(dto);
    }
    String a = serializationList(lst, CustomCategoryDto.class);
    List<CustomCategoryDto> newValue = deserializationList(a,
        CustomCategoryDto.class);
    Assert.assertEquals(lst.size(), newValue.size());
  }
  @Test(invocationCount = 1, threadPoolSize = 1)
  public void testMap() {
    Map<String, CustomItemDto> map = new HashMap<String, CustomItemDto>();
    for (int i = 0; i < 10; i++) {
      CustomItemDto val = new CustomItemDto();
      val.setId(Long.parseLong(String.valueOf(i)));
      val.setItemCode("");
      val.setItemDespositPrice(32.45);
      val.setItemMemo(null);
      val.setItemName("张金");
      val.setItemPrice(89.02);
      val.setSort(10);
      map.put(new ObjectId().toString(), val);
    }
    String a = serializationMap(map, CustomItemDto.class);
    Map<String, CustomItemDto> newValue = deserializationMap(a,
        CustomItemDto.class);
    Assert.assertEquals(map.size(), newValue.size());
  }
  @Test(invocationCount = 1, threadPoolSize = 1)
  public void testSet() {
    Set<CustomItemDto> set = new HashSet<CustomItemDto>();
    for (int i = 0; i < 10; i++) {
      CustomItemDto val = new CustomItemDto();
      val.setId(Long.parseLong(String.valueOf(i)));
      val.setItemCode("");
      val.setItemDespositPrice(32.45);
      val.setItemMemo(null);
      val.setItemName("金星");
      val.setItemPrice(89.02);
      val.setSort(10);
      set.add(val);
    }
    String a = serializationSet(set, CustomItemDto.class);
    Set<CustomItemDto> newValue = deserializationSet(a, CustomItemDto.class);
    Assert.assertEquals(set.size(), newValue.size());
  }
  private <T extends Serializable> String serializationObject(T obj) {
    Kryo kryo = new Kryo();
    kryo.setReferences(false);
    kryo.register(obj.getClass(), new JavaSerializer());
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Output output = new Output(baos);
    kryo.writeClassAndObject(output, obj);
    output.flush();
    output.close();
    byte[] b = baos.toByteArray();
    try {
      baos.flush();
      baos.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return new String(new Base64().encode(b));
  }
  @SuppressWarnings("unchecked")
  private <T extends Serializable> T deserializationObject(String obj,
      Class<T> clazz) {
    Kryo kryo = new Kryo();
    kryo.setReferences(false);
    kryo.register(clazz, new JavaSerializer());
    ByteArrayInputStream bais = new ByteArrayInputStream(
        new Base64().decode(obj));
    Input input = new Input(bais);
    return (T) kryo.readClassAndObject(input);
  }
  private <T extends Serializable> String serializationList(List<T> obj,
      Class<T> clazz) {
    Kryo kryo = new Kryo();
    kryo.setReferences(false);
    kryo.setRegistrationRequired(true);
    CollectionSerializer serializer = new CollectionSerializer();
    serializer.setElementClass(clazz, new JavaSerializer());
    serializer.setElementsCanBeNull(false);
    kryo.register(clazz, new JavaSerializer());
    kryo.register(ArrayList.class, serializer);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Output output = new Output(baos);
    kryo.writeObject(output, obj);
    output.flush();
    output.close();
    byte[] b = baos.toByteArray();
    try {
      baos.flush();
      baos.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return new String(new Base64().encode(b));
  }
  @SuppressWarnings("unchecked")
  private <T extends Serializable> List<T> deserializationList(String obj,
      Class<T> clazz) {
    Kryo kryo = new Kryo();
    kryo.setReferences(false);
    kryo.setRegistrationRequired(true);
    CollectionSerializer serializer = new CollectionSerializer();
    serializer.setElementClass(clazz, new JavaSerializer());
    serializer.setElementsCanBeNull(false);
    kryo.register(clazz, new JavaSerializer());
    kryo.register(ArrayList.class, serializer);
    ByteArrayInputStream bais = new ByteArrayInputStream(
        new Base64().decode(obj));
    Input input = new Input(bais);
    return (List<T>) kryo.readObject(input, ArrayList.class, serializer);
  }
  private <T extends Serializable> String serializationMap(
      Map<String, T> obj, Class<T> clazz) {
    Kryo kryo = new Kryo();
    kryo.setReferences(false);
    kryo.setRegistrationRequired(true);
    MapSerializer serializer = new MapSerializer();
    serializer.setKeyClass(String.class, new JavaSerializer());
    serializer.setKeysCanBeNull(false);
    serializer.setValueClass(clazz, new JavaSerializer());
    serializer.setValuesCanBeNull(true);
    kryo.register(clazz, new JavaSerializer());
    kryo.register(HashMap.class, serializer);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Output output = new Output(baos);
    kryo.writeObject(output, obj);
    output.flush();
    output.close();
    byte[] b = baos.toByteArray();
    try {
      baos.flush();
      baos.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return new String(new Base64().encode(b));
  }
  @SuppressWarnings("unchecked")
  private <T extends Serializable> Map<String, T> deserializationMap(
      String obj, Class<T> clazz) {
    Kryo kryo = new Kryo();
    kryo.setReferences(false);
    kryo.setRegistrationRequired(true);
    MapSerializer serializer = new MapSerializer();
    serializer.setKeyClass(String.class, new JavaSerializer());
    serializer.setKeysCanBeNull(false);
    serializer.setValueClass(clazz, new JavaSerializer());
    serializer.setValuesCanBeNull(true);
    kryo.register(clazz, new JavaSerializer());
    kryo.register(HashMap.class, serializer);
    ByteArrayInputStream bais = new ByteArrayInputStream(
        new Base64().decode(obj));
    Input input = new Input(bais);
    return (Map<String, T>) kryo.readObject(input, HashMap.class,
        serializer);
  }
  public static <T extends Serializable> String serializationSet(Set<T> obj,
      Class<T> clazz) {
    Kryo kryo = new Kryo();
    kryo.setReferences(false);
    kryo.setRegistrationRequired(true);
    CollectionSerializer serializer = new CollectionSerializer();
    serializer.setElementClass(clazz, new JavaSerializer());
    serializer.setElementsCanBeNull(false);
    kryo.register(clazz, new JavaSerializer());
    kryo.register(HashSet.class, serializer);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Output output = new Output(baos);
    kryo.writeObject(output, obj);
    output.flush();
    output.close();
    byte[] b = baos.toByteArray();
    try {
      baos.flush();
      baos.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return new String(new Base64().encode(b));
  }
  @SuppressWarnings("unchecked")
  public static <T extends Serializable> Set<T> deserializationSet(
      String obj, Class<T> clazz) {
    Kryo kryo = new Kryo();
    kryo.setReferences(false);
    kryo.setRegistrationRequired(true);
    CollectionSerializer serializer = new CollectionSerializer();
    serializer.setElementClass(clazz, new JavaSerializer());
    serializer.setElementsCanBeNull(false);
    kryo.register(clazz, new JavaSerializer());
    kryo.register(HashSet.class, serializer);
    ByteArrayInputStream bais = new ByteArrayInputStream(
        new Base64().decode(obj));
    Input input = new Input(bais);
    return (Set<T>) kryo.readObject(input, HashSet.class, serializer);
  }
}

总结

以上就是本文关于Kryo序列化及反序列化用法示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:java原生序列化和Kryo序列化性能实例对比分析 、 Kryo框架使用方法代码示例等,有什么问题可以随时留言,小编一定竭尽所能,答您所问。

(0)

相关推荐

  • Java下利用Jackson进行JSON解析和序列化示例

    Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的JSON操作方法. 一.准备工作 首先去官网下载Jackson工具包.Jackson有1.x系列和2.x系列,截止目前2.x系列的最新版本是2.2.3,2.x系列有3个jar包需要下载: jackson-core-2.2.3.jar(核心jar包,下载地址) jackson-annotations-2

  • 序列化版本号serialVersionUID的作用_动力节点Java学院整理

    Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象. 序列化是Java中实现持久化存储的一种方法:为数据传输提供了线路级对象表示法. Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常. Eclipse中The

  • java原生序列化和Kryo序列化性能实例对比分析

    简介 最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括: 专门针对Java语言的:Kryo,FST等等 跨语言的:Protostuff,ProtoBuf,Thrift,Avro,MsgPack等等 这些序列化方式的性能多数都显著优于hessian2(甚至包括尚未成熟的dubbo序列化).有鉴于此,我们为dubbo引入Kryo和FST这 两种高效Java序列化实现,来逐步取代hessian2.其中,Kryo是一种非常成熟的序列化实现,已经在Twitter.Group

  • Java 对象序列化 NIO NIO2详细介绍及解析

    Java 对象序列化 NIO NIO2详细介绍及解析 概要: 对象序列化 对象序列化机制允许把内存中的Java对象转换成与平台无关的二进制流,从而可以保存到磁盘或者进行网络传输,其它程序获得这个二进制流后可以将其恢复成原来的Java对象. 序列化机制可以使对象可以脱离程序的运行而对立存在 序列化的含义和意义 序列化 序列化机制可以使对象可以脱离程序的运行而对立存在 序列化(Serialize)指将一个java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢

  • java 中Spark中将对象序列化存储到hdfs

    java 中Spark中将对象序列化存储到hdfs 摘要: Spark应用中经常会遇到这样一个需求: 需要将JAVA对象序列化并存储到HDFS, 尤其是利用MLlib计算出来的一些模型, 存储到hdfs以便模型可以反复利用. 下面的例子演示了Spark环境下从Hbase读取数据, 生成一个word2vec模型, 存储到hdfs. 废话不多说, 直接贴代码了. spark1.4 + hbase0.98 import org.apache.spark.storage.StorageLevel imp

  • 浅谈java中为什么实体类需要实现序列化

    当客户端访问某个能开启会话功能的资源,web服务器就会创建一个HTTPSession对象,每个HTTPSession对象都会占用一定的内存,如果在同一个时间段内访问的用户太多,就会消耗大量的服务器内存,为了解决这个问题我们使用一种技术:session的持久化. 什么是session的持久化? web服务器会把暂时不活动的并且没有失效的HTTPSession对象转移到文件系统或数据库中储存,服务器要用时在把他们转载到内存. 把Session对象转移到文件系统或数据库中储存就需要用到序列化: jav

  • Kryo序列化及反序列化用法示例

    Kryo 是一个快速高效的 Java 对象图形序列化框架,主要特点是性能.高效和易用.该项目用来序列化对象到文件.数据库或者网络. 代码地址:https://github.com/EsotericSoftware/kryo 样例代码地址:https://github.com/nettm/public Kryo的序列化及反序列速度很快,据说很多大公司都在用.我在把对象序列化都转换成了字符串形式,是为了把对象存储到缓存中.我们日常项目中使用的数据形式包括对象.List.Set和Map,因此主要把这几

  • Python Json序列化与反序列化的示例

    不同的编程语言有不同的数据类型; 比如说: Python的数据类型有(dict.list.string.int.float.long.bool.None) Java的数据类型有(bool.char.byte.short.int.long.float.double) C的数据类型有(bit.bool.char.int.short.long.unsigned.double.float) Tcl的数据类型(int.bool.float.string) Ruby的数据类型(Number.String.R

  • python3序列化与反序列化用法实例

    本文实例讲述了python3序列化与反序列化用法.分享给大家供大家参考.具体如下: #coding=utf-8 import pickle aa={} aa["title"]="我是好人" aa["num"]=2 t=pickle.dumps(aa)#序列化这个字典 print(t) f=pickle.loads(t)#反序列化,还原原来的状态 print(f) 运行结果如下: (dp0 S'num' p1 I2 sS'title' p2 S'\

  • Python使用pickle进行序列化和反序列化的示例代码

    一.说明 早上看到Python使用pickle进行序列化和反序列化,然后发现面临的一个获取不到返回值的框架,似乎可以通过在框架中先序列化,然后在外部进行反序列化的方法来实现.就研究了一下pickle库的具体使用. 本身也没什么复杂,一方面还是怕忘记,另一方面是自从学Java听到反序化这个词开始就有一种莫明其妙的恐具感总觉得是什么高大上的东西.Java反序列化可参见"Java反序列化漏洞实现". 二.代码实现 import pickle class BeSerializing: def

  • JS实现json的序列化和反序列化功能示例

    本文实例讲述了JS实现json的序列化和反序列化功能.分享给大家供大家参考,具体如下: 序列化: var s = new Object(); s.Name = "clientValue"; s.Id = 1; s.ClassId = 2; var data = JSON.stringify(s); console.log(data); 反序列化: eval将字符串反序列化成对象 var s = eval('(' + data+ ')'); console.log(s.Name); 完整

  • 深入分析XmlSerializer对象的Xml序列化与反序列化的示例详解

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间.为什么要做序列化和反序列化?.Net程序执行时,对象都驻留在内存中:内存中的对象如果需要传递给其他系统使用:或者在关机时需要保存下来以便下次再次启动程序使用就需要序列化和反序列化.范围:本文只介绍xml序列化,其实序列化可以是二进制的序列化,也可以是其他格式的序列化.看一段最简单的Xml序列化代码 复制代码 代码如下: class Program{    static void

  • Python3.5 Json与pickle实现数据序列化与反序列化操作示例

    本文实例讲述了Python3.5 Json与pickle实现数据序列化与反序列化操作.分享给大家供大家参考,具体如下: 1.Json:不同语言之间进行数据交互. (1)JSON数据序列化:dumps() JSON数据是一种轻量级的数据交换格式,序列化:将内存数据对象变成字符串. #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu import json info = { "name":"liu

  • Java对象的XML序列化与反序列化实例解析

    上一篇文章我们介绍了java实现的各种排序算法代码示例,本文我们看看Java对象的xml序列化与反序列化的相关内容,具体如下. XML是一种标准的数据交换规范,可以方便地用于在应用之间交换各类数据.如果能在Java对象和XML文档之间建立某种映射,例如Java对象的XML序列化和反序列化,那么就可以使Java的对象方便地与其他应用进行交换. java.beans包里面有两个类XMLEncoder和Decoder,分别用于将符合JabaBeans规范的Java对象以XML方式序列化和反序列化.以下

  • JAVA序列化和反序列化的底层实现原理解析

    一.基本概念 1.什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: (2)**序列化:**对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性.序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中.序列化后的字节流保存了Java对象的状态以及相关的描述信息.序列化机制的核心作用就是对象状态的保存与重建. (3)**反序列化:**客户端从文件中或网络上获得序列化后

  • .NET中XML序列化和反序列化常用类和属性小结

    目录 序列化和反序列化是指什么? XmlSerializer类 .NET-XML序列化和反序列化简单示例代码 XmlTypeAttribute类 应用示例 XmlElementAttribute类 应用示例 XmlAttributeAttribute类 应用示例 XmlArrayAttribute类 应用示例 XmlTextAttribute类 应用示例 XmlIgnoreAttribute类 应用示例 用来控制XML序列化的属性汇总 参考文章 序列化和反序列化是指什么? 序列化(seriall

随机推荐