当前位置: 首页 > news >正文

【序列化工具JdkSerialize和Protostuff】

序列化工具对比

  • JdkSerialize:java内置的序列化能将实现了Serilazable接口的对象进行序列化和反序列化, ObjectOutputStream的writeObject()方法可序列化对象生成字节数组

  • Protostuff:google开源的protostuff采用更为紧凑的二进制数组,表现更加优异,然后使用protostuff的编译工具生成pojo类

JdkSerializeUtil


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;/*** jdk序列化*/
public class JdkSerializeUtil {/*** 序列化* @param obj* @param <T>* @return*/public static <T> byte[] serialize(T obj) {if (obj  == null){throw new NullPointerException();}ByteArrayOutputStream bos = new ByteArrayOutputStream();try {ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(obj);return bos.toByteArray();} catch (Exception ex) {ex.printStackTrace();}return new byte[0];}/*** 反序列化* @param data* @param clazz* @param <T>* @return*/public static <T> T deserialize(byte[] data, Class<T> clazz) {ByteArrayInputStream bis = new ByteArrayInputStream(data);try {ObjectInputStream ois = new ObjectInputStream(bis);T obj = (T)ois.readObject();return obj;} catch (Exception ex) {ex.printStackTrace();}return  null;}}

ProtostuffUtil (优选)


import com.heima.model.wemedia.pojos.WmNews;
import io.protostuff.LinkedBuffer;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema;public class ProtostuffUtil {/*** 序列化* @param t* @param <T>* @return*/public static <T> byte[] serialize(T t){Schema schema = RuntimeSchema.getSchema(t.getClass());return ProtostuffIOUtil.toByteArray(t,schema,LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));}/*** 反序列化* @param bytes* @param c* @param <T>* @return*/public static <T> T deserialize(byte []bytes,Class<T> c) {T t = null;try {t = c.newInstance();Schema schema = RuntimeSchema.getSchema(t.getClass());ProtostuffIOUtil.mergeFrom(bytes,t,schema);} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return t;}}

Protostuff需要引导依赖:

<dependency><groupId>io.protostuff</groupId><artifactId>protostuff-core</artifactId><version>1.6.0</version>
</dependency><dependency><groupId>io.protostuff</groupId><artifactId>protostuff-runtime</artifactId><version>1.6.0</version>
</dependency>

测试

/*** jdk序列化与protostuff序列化对比* @param args*/public static void main(String[] args) {long start =System.currentTimeMillis();for (int i = 0; i <1000000 ; i++) {WmNews wmNews =new WmNews();  //自己测试创建的对象JdkSerializeUtil.serialize(wmNews);}System.out.println(" jdk 花费 "+(System.currentTimeMillis()-start));start =System.currentTimeMillis();for (int i = 0; i <1000000 ; i++) {WmNews wmNews =new WmNews();ProtostuffUtil.serialize(wmNews);}System.out.println(" protostuff 花费 "+(System.currentTimeMillis()-start));}

结果:

http://www.lryc.cn/news/103196.html

相关文章:

  • C++ 多线程编程导论(下)
  • Java并发系列之一:JVM线程模型
  • 容灾独家技术揭秘:HyperBDR无主机数据同步技术
  • FANUC机器人SRVO-050碰撞检测报警和SRVO-053干扰值过大故障报警总结
  • 微信如何提高回复信息速度?
  • 模拟Stevens Lewis描述的小型飞机纵向动力学的非线性动态反演控制器研究(Matlab代码实现)
  • 【C++从0到王者】第十二站:vector基本使用
  • 了解Unity编辑器之组件篇Miscellaneous(九)
  • 自动驾驶小车
  • 机器学习深度学习——多层感知机的从零开始实现
  • Redis的基本使用命令
  • Ts入门到放弃
  • 黑客技术(网络安全)学习笔记
  • Cloud Kernel SIG 月度动态:支持龙芯和申威架构,合入两个内存新特性
  • IDEA中连接虚拟机 管理Docker
  • Debezium日常分享系列之:定制Debezium 信号发送和通知
  • RpcProvider(rpc服务提供者)实现思路
  • GNSS技术知识你知道多少?这些你或许还未掌握
  • YOLOv8教程系列:三、使用YOLOv8模型进行自定义数据集半自动标注
  • AI聊天GPT三步上篮!
  • 如何彻底卸载VMware
  • [个人笔记] Windows配置NTP时间同步
  • Jetson Docker 编译 FFmpeg 支持硬解nvmpi和cuvid
  • 某某某小说app接口抓包分析
  • 开发一个RISC-V上的操作系统(四)—— 内存管理
  • 区块链:可验证随机函数
  • Flask中flask-session
  • react-Native init初始化项目报错”TypeError: cli.init is not a function“
  • 【gitlib】linux系统rpm安装gitlib最新版本
  • iOS开发-检查版本更新与强制更新控制