加入pom

<dependency><groupId>com.esotericsoftware</groupId><artifactId>kryo</artifactId><version>4.0.0</version>
</dependency>
package cn.witsky.utils;import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.pool.KryoCallback;
import com.esotericsoftware.kryo.pool.KryoFactory;
import com.esotericsoftware.kryo.pool.KryoPool;
import com.esotericsoftware.kryo.serializers.CollectionSerializer;
import com.esotericsoftware.kryo.serializers.JavaSerializer;
import org.objenesis.strategy.StdInstantiatorStrategy;import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** KryoUtils序列化和反序列化操作官方文档:中文:https://blog.csdn.net/fanjunjaden/article/details/72823866英文:https://github.com/EsotericSoftware/kryo*/
public class KryoUtils  {/* Kryo有三组读写对象的方法* 1.如果不知道对象的具体类,且对象可以为null: kryo.writeClassAndObject(output, object); Object object = kryo.readClassAndObject(input);* 2.如果类已知且对象可以为null: kryo.writeObjectOrNull(output, someObject); SomeClass someObject = kryo.readObjectOrNull(input, SomeClass.class);* 3.如果类已知且对象不能为null:  kryo.writeObject(output, someObject); SomeClass someObject = kryo.readObject(input, SomeClass.class);*//*** (池化Kryo实例)使用ThreadLocal*/private static final ThreadLocal<Kryo> kryos = new ThreadLocal<Kryo>() {@Overrideprotected Kryo initialValue() {Kryo kryo = new Kryo();/*** 不要轻易改变这里的配置,更改之后,序列化的格式就会发生变化,* 上线的同时就必须清除 Redis 里的所有缓存,* 否则那些缓存再回来反序列化的时候,就会报错*///支持对象循环引用(否则会栈溢出)kryo.setReferences(true); //默认值就是 true,添加此行的目的是为了提醒维护者,不要改变这个配置//不强制要求注册类(注册行为无法保证多个 JVM 内同一个类的注册编号相同;而且业务系统中大量的 Class 也难以一一注册)kryo.setRegistrationRequired(false); //默认值就是 false,添加此行的目的是为了提醒维护者,不要改变这个配置//Fix the NPE bug when deserializing Collections.((Kryo.DefaultInstantiatorStrategy) kryo.getInstantiatorStrategy()).setFallbackInstantiatorStrategy(new StdInstantiatorStrategy());return kryo;}};/*** (池化Kryo实例)使用KryoPool*/private static KryoFactory factory = new KryoFactory() {public Kryo create () {Kryo kryo = new Kryo();return kryo;}};private static KryoPool pool = new KryoPool.Builder(factory).softReferences().build();/*** 使用ThreadLocal创建Kryo* 把java对象序列化成byte[];* @param obj java对象* @return*/public static <T>  byte[] serializeObject(T obj) {ByteArrayOutputStream os=null;Output output=null;if(null != obj){Kryo kryo = kryos.get();try {os = new ByteArrayOutputStream();output = new Output(os);kryo.writeObject(output, obj);close(output);return os.toByteArray();} catch (Exception e) {e.printStackTrace();}finally {close(os);}}return null;}/*** 使用ThreadLocal创建Kryo* 把byte[]反序列化成指定的java对象* @param bytes* @param t 指定的java对象* @param <T>* @return 指定的java对象*/public static <T> T unSerializeObject(byte[] bytes,Class<T> t) {ByteArrayInputStream is=null;Input input=null;if(null != bytes && bytes.length>0 && null!=t){try {Kryo kryo = kryos.get();is = new ByteArrayInputStream(bytes);input = new Input(is);return kryo.readObject(input,t);} catch (Exception e) {e.printStackTrace();}finally {close(is);close(input);}}return null;}/*** 使用ThreadLocal创建Kryo* 把List序列化成byte[];* @param list java对象* @return*/public static <T>  byte[]  serializeList(List<T> list ) {ByteArrayOutputStream os=null;Output output=null;byte[] bytes = null;if(null != list && list.size()>0){Kryo kryo = kryos.get();try {os = new ByteArrayOutputStream();output = new Output(os);kryo.writeObject(output,list);close(output);bytes = os.toByteArray();return bytes;} catch (Exception e) {e.printStackTrace();}finally {close(os);}}return null;}/*** 使用ThreadLocal创建Kryo* 把byte[]反序列化成指定的List<T>* @param bytes byte数组* @param <T>* @return 指定java对象的List*/public static <T> List<T> unSerializeList(byte[] bytes) {ByteArrayInputStream is=null;Input input=null;if(null !=bytes && bytes.length>0){try {Kryo kryo = kryos.get();is = new ByteArrayInputStream(bytes);input = new Input(is);List<T> list = kryo.readObject(input,ArrayList.class);return list;} catch (Exception e) {e.printStackTrace();}finally {close(is);close(input);}}return null;}/*** 使用ThreadLocal创建Kryo* 把java对象转序列化存储在文件中;* @param obj java对象* @return*/public static <T>  boolean serializeFile(T obj,String path) {if(null != obj){Output output=null;try {Kryo kryo = kryos.get();output = new Output(new FileOutputStream(path));kryo.writeObject(output, obj);return true;} catch (Exception e) {e.printStackTrace();}finally {close(output);}}return false;}/*** 使用ThreadLocal创建Kryo* 把序列化的文件反序列化成指定的java对象* @param path 文件路径* @param t 指定的java对象* @param <T>* @return 指定的java对象*/public static <T> T unSerializeFile(String path,Class<T> t) {if(null != path && null !=t ){Input input=null;try {Kryo kryo = kryos.get();input = new Input(new FileInputStream(path));return kryo.readObject(input,t);} catch (Exception e) {e.printStackTrace();}finally {close(input);}}return null;}/*** 使用KryoPool SoftReferences创建Kryo* 把java对象序列化成byte[] ;* @param obj java对象* @return*/public static <T>  byte[] serializePoolSoftReferences (T obj) {if(null!=obj){Kryo kryo =pool.borrow();ByteArrayOutputStream os=null;Output output=null;try {os = new ByteArrayOutputStream();output = new Output(os);kryo.writeObject(output, obj);close(output);byte [] bytes = os.toByteArray();return bytes;} catch (Exception e) {e.printStackTrace();}finally {pool.release(kryo);close(os);}}return null;}/*** 使用KryoPool SoftReferences创建Kryo* 把byte[]反序列化成指定的java对象* @param bytes* @return*/public static <T> T unSerializePoolSoftReferences(byte[] bytes,Class<T> t) {if(null !=bytes && bytes.length>0 && null!=t){Kryo kryo =pool.borrow();ByteArrayInputStream is=null;Output output=null;try {is = new ByteArrayInputStream(bytes);Input input= new Input(is);return kryo.readObject(input, t);} catch (Exception e) {e.printStackTrace();}finally {pool.release(kryo);close(is);close(output);}}return null;}/*** 使用KryoPool SoftReferences创建Kryo* 把java对象序列化成byte[] ;* @param obj java对象* @return*/public static <T>  byte[] serializePoolCallback (final T obj) {if(null != obj){try {return pool.run(new KryoCallback<byte[]>() {public byte[] execute(Kryo kryo) {ByteArrayOutputStream os = new ByteArrayOutputStream();Output output = new Output(os);kryo.writeObject(output,obj);output.close();try {os.close();} catch (IOException e) {e.printStackTrace();}return os.toByteArray();}});} catch (Exception e) {e.printStackTrace();}}return null;}/*** 使用KryoPool SoftReferences创建Kryo* 把byte[]反序列化成指定的java对象* @param bytes* @return*/public static <T> T unSerializePoolCallback(final byte[] bytes, final Class<T> t) {if(null != bytes && bytes.length>0 && null != t){try {return pool.run(new KryoCallback<T>() {public T execute(Kryo kryo) {ByteArrayInputStream is = new ByteArrayInputStream(bytes);Input input = new Input(is);T result =kryo.readObject(input,t);input.close();try {is.close();} catch (IOException e) {e.printStackTrace();}return result;}});} catch (Exception e) {e.printStackTrace();}}return null;}/*** 关闭io流对象** @param closeable*/public static void close(Closeable closeable) {if (closeable != null) {try {closeable.close();} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) throws FileNotFoundException {Test t=new Test();t.setA("a");t.setB("b");t.setC(1);ArrayList<Test> arrayList=new ArrayList();arrayList.add(t);byte[] testBean=serializeObject(t);Test test=unSerializeObject(testBean,Test.class);byte[] listBean=serializeObject(arrayList);ArrayList<Test> list=unSerializeObject(listBean,ArrayList.class);ArrayList<String> StringList=new ArrayList();StringList.add("aa");StringList.add("f");StringList.add("afa");StringList.add("ahha");byte[] stringList=serializeList(StringList);List<String> lists=unSerializeList(stringList);List<String> listObject=unSerializeObject(stringList,ArrayList.class);byte[] stringList2=serializePoolSoftReferences(StringList);List<String> lists2=unSerializePoolSoftReferences(stringList2,ArrayList.class);byte[] stringList3=serializePoolCallback(StringList);List<String> lists3=unSerializePoolCallback(stringList3,ArrayList.class);/* ArrayList<Map<String,String>> mapList=new ArrayList();Map<String,String> map1=new HashMap<String, String>();map1.put("1","a");Map<String,String> map2=new HashMap<String, String>();map2.put("1","b");mapList.add(map1);mapList.add(map2);byte[] mapListByte=serializeObject(mapList);List<Map<String,String>> listMaps=unSerializeObject(mapListByte,ArrayList.class);System.out.println("");byte[] mapByte=serializeObject(map1);Map<String,String> Maps=unSerializeObject(mapByte,HashMap.class);List<Test> listww = new ArrayList<Test>();Test p ;for(int i=0;i<=10000;i++){p = new Test();p.setA("ww"+i);listww.add(p);}serializeFile(listww,"F://file.txt");List<Test> ddd=unSerializeFile("F://file.txt",ArrayList.class);byte[] www=serializeObject(listww);System.out.println("=="+www.length);List<Test> ddd=unSerializeObject(www,ArrayList.class);*/System.out.println("");}}

Kryo工具类 序列化和反序列化操作工具类KryoUtils相关推荐

  1. C# 实体类序列化与反序列化一 (XmlSerializer)

    /// <summary>/// 实体类序列化的反序列化的类/// </summary>/// <typeparam name="T">< ...

  2. Xml序列化、反序列化帮助类

    之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 1 /// <summary> ...

  3. spring boot添加 LocalDateTime 等 java8 时间类序列化和反序列化的支持

    由于项目将原有的  Date类型的字段改造为 LocalDate,LocalDateTime,LocalTime 类型, 发现  spring  对项目的时间格式无法自动转换,故需手动配置下. 在sp ...

  4. json 反序列化 父子类型_json类序列化与反序列化参考

    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Runtime.Ser ...

  5. fileinputstream自定义类序列化和反序列化_Rest Assured篇:Java中的序列化和反序列化...

    点击上方蓝字设为星标 每天傍晚伴你一起成长! Java 中的序列化和反序列化是一个重要的编程概念.它适用于所有主要的编程语言.在本章中,我们将尝试在Java语言的上下文中理解此概念.在本章的最后,我们 ...

  6. java序列化和反序列化工具_Java 序列化和反序列化工具类并解决StreamCorruptedException问题 | 学步园...

    问题: 若通过ObjectOutputStream向一个文件中多次以追加的方式写入Object,为什么用ObjectInputStream读取这些Object时,会产生StreamCorruptedE ...

  7. dubbo中使用kryo进行对象序列化,反序列化时报错

    最近在项目中遇到一个问题,应用部署到tomcat后启动报错,异常的大致意思是反序列话失败.dubbo中开启的序列化方式为kyro,自己对dubbo并不怎么熟悉,迷迷糊糊查了一圈.最后错误原因是因为消费 ...

  8. SpringDataJpa的使用 – 实体类序列化

    SpringDataJpa的使用 – 实体类序列化 前面提到了 JAP 的几个常用注解 @OneToOne.@OneToMany.@ManyToOne.@ManyToMany 的使用,但没有说 序列化 ...

  9. 【RPC】序列化与反序列化

    文章目录 1. 基本概念? 2. 文本格式的序列化方案 2.1 XML格式 2.2 JSON格式 3. 二进制格式的序列化方法 4. 序列化框架选型 1. 基本概念? 序列化和反序列化是一种数据转化的 ...

  10. java get方法不序列化_java常用序列化与反序列化方法

    序列化工具类 序列化即将对象序列化为字节数组,反序列化就是将字节数组恢复成对象. 主要的目的是方便传输和存储. 序列化工具类: public class SerializeUtil { private ...

最新文章

  1. 与其羡慕他人精彩,还不如设法活出自我
  2. 字段定义_两大高招逐浪CMS中定义省地市县三级字段显示方式
  3. poj 2010(优先队列)
  4. PL-SLAM: a Stereo SLAM System through the Combination of Points and Line Segments
  5. .animate css,animate-css
  6. 5二代配什么主板最好_新教育5:父母什么时间陪伴孩子最好
  7. 最新最全MTK联发科手机芯片型号及参数汇总
  8. 傅里叶级数与傅里叶变换_Part0_欧拉公式证明+三角函数和差公式证明
  9. 正态分布基本概念及公式
  10. 一台电脑已经连接WIFI,另一台电脑想通过网线连接到网络
  11. 卷毛机器人抢大龙_EDG卷毛宣布退役:感谢WE和EDG的培养
  12. 【JAVA长虹键法】第 十二式 外观模式(23种设计模式)
  13. 王家林老师Spark学习第一课
  14. Kepserver EX6配置opc ua服务端 以及客户端
  15. 计算机文件管理评课稿,城沙二小《整理文件》评课稿
  16. Python基础;个人名片制作程序
  17. js前台与后台数据交互-前台调后台
  18. 成功解决socket.timeout: The read operation timed out问题
  19. symfony3.4文档
  20. 火绒剑(专业人员使用的系统进程分析工具)

热门文章

  1. Java-面向对象构造函数 -(private private)关键字
  2. java黄金分割_黄金分式与黄金分割数(Java实现)
  3. html竖版古诗,古诗竖版手抄报版面设计图
  4. SAP系统中的几种系统级消息(用户登录后消息弹窗SM02,TH_POPUP,以及系统邮件)
  5. java餐厅点餐系统免费_基于jsp的餐厅点餐系统-JavaEE实现餐厅点餐系统 - java项目源码...
  6. Using ‘UTF-8‘ encoding to copy filtered resources. skip non existing resourceDirectory
  7. 有关JavaScript中条件逻辑的权威指南
  8. 私网地址与公网地址转换
  9. python运行环境怎么配置_python配置环境 菜鸟教程,python的运行环境怎么配置
  10. 【Linux】Ubuntu运行环境搭建