热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于kryo完成对象的序列化和反序列化

Step01:定义mail类:packagecom.java.serializable;importjava.io.Serializable;importjava.util.D

Step01:定义mail类:

package com.java.serializable;import java.io.Serializable;
import java.util.Date;public class Mail implements Serializable{private static final long serialVersionUID = 6599166688654530165L;private Integer id;private String title;private String content;private Date createdTime;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public Date getCreatedTime() {return createdTime;}public void setCreatedTime(Date createdTime) {this.createdTime = createdTime;}@Overridepublic String toString() {return "Mail [id=" + id + ", title=" + title + ", content=" + content + ", createdTime=" + createdTime + "]";}}

Step02:添加依赖

com.esotericsoftwarekryo5.0.0-RC4

Step03:编写测试类

package com.java.serializable;
import java.util.Date;import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
public class TestSerializable06 {public static void main(String[] args) {Mail m=new Mail();m.setId(100);m.setTitle("test");m.setContent("this is test content");m.setCreatedTime(new Date());//基于Kryo框架将对象序列化Kryo kryo=new Kryo();//将默认类的自动注册功能关闭(默认会将类全名序列化)kryo.setRegistrationRequired(false);//kryo.register(Mail.class);//kryo.register(Date.class);ByteArrayOutputStream bos=//内置可扩容数组new ByteArrayOutputStream();Output output=new Output(bos);kryo.writeObject(output, m);output.close();System.out.println("序列化ok");//基于Kryo框架将对象反序列化byte[] data=bos.toByteArray();Input input=new Input(data);Mail m2=kryo.readObject(input,Mail.class);input.close();System.out.println(m2);}
}

结果:

序列化ok
Mail [id=100, title=test, content=this is test content, createdTime=Mon Nov 11 14:15:35 CST 2019]

说明:可将如上序列化方法进行封装,写到序列化工具类中,例如

package com.java.serializable;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
//基于Kryo框架实现对象序列化和反序列化.
/*** kryo 对象是一个线程不安全对象,不允许多线程共享.* 可以每个线程有一份。那如何保证每个线程此类的实例* 只有一份呢?可以借助ThreadLocal实现。* * ThreadLocal 提供一种线程绑定机制,可以基于* 此对象将某个对象绑定当前线程中,也可以从当前* 线程获取某个对象.* 1)set() 绑定* 2)get() 获取*/
public class KryoSerializationUtil {//static Kryo kryo = new Kryo();//线程共享private static final ThreadLocal kryos = new ThreadLocal() {//获取当前线程中Kryo对象时,假如线程中没有此对象//此时会调用initialValue创建对象并通过set方法绑定当前线程protected Kryo initialValue() {Kryo kryo = new Kryo();kryo.setRegistrationRequired(false);// Configure the Kryo instance.return kryo;};};//序列化public static byte[] serializable(T t) throws IOException{//1.构建kryo对象//Kryo k = new Kryo();//k.setRegistrationRequired(false);//2.构建字节数组输出流(内置可扩容数组)ByteArrayOutputStream bos=new ByteArrayOutputStream();//3.构建处理流output对象Output output=new Output(bos);//4.将对象序列化kryos.get().writeObject(output, t);output.flush();byte[] array=bos.toByteArray();output.close();return array;}//反序列化public staticT deserialization(byte[] array,Class cls) {//1.构建kryo对象//Kryo k=new Kryo();//k.setRegistrationRequired(false);//2.构建input对象(负责读字节数据)Input input=new Input(array);//3.反序列化数据T t=(T)kryos.get().readObject(input,cls);input.close();return t;}
}

编写测试类:

package com.java.serializable;
import java.io.IOException;
import java.util.Date;
public class TestSerializable07 {public static void main(String[] args)throws IOException {Mail m=new Mail();m.setId(100);m.setTitle("test");m.setContent("this is test content");m.setCreatedTime(new Date());//基于Kryo框架将对象序列化byte[] array=KryoSerializationUtil.serializable(m);System.out.println("序列化OK,array.length="+array.length);//基于Kryo框架将对象反序列化Mail m2=KryoSerializationUtil.deserialization(array,Mail.class);System.out.println(m2);}
}

运行结果:

序列化OK,array.length=49
Mail [id=100, title=test, content=this is test content, createdTime=Mon Nov 11 18:04:03 CST 2019]

知识补充:

ThreadLocal原理及详解参考文章:https://www.cnblogs.com/dolphin0520/p/3920407.html


推荐阅读
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 通过采用用户数据报协议(UDP),本研究设计并实现了一种高效的文件传输方法。在发送端,系统利用Java编程语言中的相关类库,如`File`和`FileInputStream`,实现了文件的读取与分段处理,确保了数据的快速传输。该方法不仅提高了传输效率,还降低了网络拥塞的风险,适用于大规模文件传输场景。 ... [详细]
  • 开发笔记:深入解析Android自定义控件——Button的72种变形技巧
    开发笔记:深入解析Android自定义控件——Button的72种变形技巧 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 本文介绍了如何利用Apache POI库高效读取Excel文件中的数据。通过实际测试,除了分数被转换为小数存储外,其他数据均能正确读取。若在使用过程中发现任何问题,请及时留言反馈,以便我们进行更新和改进。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 在处理大图片时,PHP 常常会遇到内存溢出的问题。为了避免这种情况,建议避免使用 `setImageBitmap`、`setImageResource` 或 `BitmapFactory.decodeResource` 等方法直接加载大图。这些函数在处理大图片时会消耗大量内存,导致应用崩溃。推荐采用分块处理、图像压缩和缓存机制等策略,以优化内存使用并提高处理效率。此外,可以考虑使用第三方库如 ImageMagick 或 GD 库来处理大图片,这些库提供了更高效的内存管理和图像处理功能。 ... [详细]
  • Sanic 是一个类似于 Flask 的 Python 3.5 Web 服务器,以其出色的写入速度而著称。与 Flask 不同,Sanic 支持异步请求处理,这使得它在处理高并发请求时表现更加出色。通过利用 Python 的异步特性,Sanic 能够显著提高应用程序的性能和响应能力,适用于构建高性能的异步 Web 应用。 ... [详细]
  • 在探讨C语言编程文本编辑器的最佳选择与专业推荐时,本文将引导读者构建一个基础的文本编辑器程序。该程序不仅能够打开并显示文本文件的内容及其路径,还集成了菜单和工具栏功能,为用户提供更加便捷的操作体验。通过本案例的学习,读者可以深入了解文本编辑器的核心实现机制。 ... [详细]
  • 在Windows环境下离线安装PyTorch GPU版时,首先需确认系统配置,例如本文作者使用的是Win8、CUDA 8.0和Python 3.6.5。用户应根据自身Python和CUDA版本,在PyTorch官网查找并下载相应的.whl文件。此外,建议检查系统环境变量设置,确保CUDA路径正确配置,以避免安装过程中可能出现的兼容性问题。 ... [详细]
author-avatar
扩散平衡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有