加入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. 该文件 linux命令,Linux网络系统,如果执行行命令#chmod 746 file.txt,那么该文件的权限是?...
  2. minitab怎么算西格玛水平_六西格玛黑带培训内容
  3. 数据结构与算法(6-4)线索二叉树
  4. Redis 的 8 大数据类型,写得非常好!
  5. 大话设计模式之装饰模式
  6. 接口、抽象类、方法复写、类Equals方法重写
  7. vue2.0 之文本渲染-v-html、v-text
  8. wordpress插件_8个虚拟教室的必备WordPress插件
  9. Leetcode每日一题:197.rising-temperature(上升的温度)
  10. Mybatis学习(5)高级映射
  11. java 鱼刺图_鱼刺卡喉咙,喝醋、吃馒头吞饭有用吗?答案全在这
  12. 皮肤暗的女孩如何穿衣服
  13. 计算机连接网络是飞行模式怎么办,电脑wifi界面只有飞行模式怎么办
  14. 计算机如何永久删除文件无法找回,怎么找回永久删除文件 找回永久删除文件方法【详细步骤】...
  15. 床帘机器人_如何打造一个更舒适更智能的大学宿舍?
  16. 没有躲过的坑--C++函数的默认参数(重新定义默认参数)
  17. 央视影音大屏版apk下载_cboxtv_2.2.0(央视影音大屏版).apk
  18. SVG实现超酷素描动画
  19. GIS空间分析(三)—— GIS环境下的空间分析
  20. 下拉滑动二级导航菜单demo

热门文章

  1. 2010提升你幽默感的经典短句
  2. 巨象指纹浏览器是如何解决账号关联问题的
  3. (一)使用 Sliced Sprite 制作 UI 图像
  4. [Unity][NGUI]Sprite精灵的Type九宫格切割Sliced没效果
  5. 美国Java程序员收入和疫情期间面试心得体会
  6. TPshop项目(三)
  7. linux下查看vnc端口_Linux的VNCServer的默认端口是多少?
  8. axure中出现小手_Axure高保真滑动拼图解锁实例教程
  9. 什么是web安全测试
  10. matlab 实现disparity,disparity-map 利用matlab立体匹配,可获得 图像左右视图的视差图代码,效果不错238万源代码下载- www.pudn.com...