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

序列化与反序列化及不同序列化方式的性能对比

在现代分布式系统中,序列化和反序列化是不可或缺的环节。它们用于将对象转换为可传输的字节流,并在接收端重建对象。本文将探讨几种常见的序列化方式,包括JSON、Java原生序列化和Protobuf,并通过实例代码进行性能对比。

序列化方式简介
  1. JSON: 简单、可读性强,但性能和体积上相对较差。
  2. Java原生序列化: Java内置,使用简单,但体积较大且性能一般。
  3. Protobuf (Protocol Buffers): Google开发的高效序列化框架,性能和体积优于JSON和Java原生序列化。
实例代码

我们将使用一个简单的类 Cat 进行序列化和反序列化测试。Cat 类包含两个属性:nameage

import java.io.*;class Cat implements Serializable {private String name;private int age;// Constructors, getters, and setterspublic Cat(String name, int age) {this.name = name;this.age = age;}// toString method@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", age=" + age +'}';}
}
JSON序列化和反序列化

我们使用 Jackson 库进行JSON序列化和反序列化。

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonSerialization {private static ObjectMapper objectMapper = new ObjectMapper();public static String serialize(Cat cat) throws IOException {return objectMapper.writeValueAsString(cat);}public static Cat deserialize(String json) throws IOException {return objectMapper.readValue(json, Cat.class);}
}

Java原生序列化和反序列化

public class NativeSerialization {public static byte[] serialize(Cat cat) throws IOException {try (ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos)) {oos.writeObject(cat);return bos.toByteArray();}}public static Cat deserialize(byte[] data) throws IOException, ClassNotFoundException {try (ByteArrayInputStream bis = new ByteArrayInputStream(data);ObjectInputStream ois = new ObjectInputStream(bis)) {return (Cat) ois.readObject();}}
}
Protobuf序列化和反序列化

首先,定义Protobuf的 .proto 文件:

syntax = "proto3";message Cat {string name = 1;int32 age = 2;
}

生成Java类后:

import com.google.protobuf.InvalidProtocolBufferException;
import example.CatProto.Cat;public class ProtobufSerialization {public static byte[] serialize(Cat cat) {return cat.toByteArray();}public static Cat deserialize(byte[] data) throws InvalidProtocolBufferException {return Cat.parseFrom(data);}
}
性能对比

我们通过以下代码进行性能测试:

import java.io.IOException;
import java.util.Arrays;public class SerializationPerformanceTest {public static void main(String[] args) throws IOException, ClassNotFoundException {Cat cat = new Cat("Whiskers", 3);// JSONlong jsonStart = System.nanoTime();String json = JsonSerialization.serialize(cat);Cat jsonCat = JsonSerialization.deserialize(json);long jsonEnd = System.nanoTime();System.out.println("JSON time: " + (jsonEnd - jsonStart));// Nativelong nativeStart = System.nanoTime();byte[] nativeData = NativeSerialization.serialize(cat);Cat nativeCat = NativeSerialization.deserialize(nativeData);long nativeEnd = System.nanoTime();System.out.println("Native time: " + (nativeEnd - nativeStart));// Protobufexample.CatProto.Cat protoCat = example.CatProto.Cat.newBuilder().setName("Whiskers").setAge(3).build();long protoStart = System.nanoTime();byte[] protoData = ProtobufSerialization.serialize(protoCat);example.CatProto.Cat protoCatDeserialized = ProtobufSerialization.deserialize(protoData);long protoEnd = System.nanoTime();System.out.println("Protobuf time: " + (protoEnd - protoStart));}
}
结论

根据测试结果,Protobuf的序列化和反序列化性能优于JSON和Java原生序列化。虽然JSON的可读性强,但在性能和体积上,Protobuf更具优势。因此,在对性能和体积有较高要求的场景下,推荐使用Protobuf进行序列化。

通过以上实例代码和测试结果,我们可以更好地理解不同序列化方式的优缺点,并根据具体需求选择合适的序列化方式。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 第四章 Redis(2023版本IDEA)
  • SVN 分支管理深入解析
  • 机器人三定律及伦理分析
  • 通过 PPPOE 将 linux 服务器作为本地局域网 IPv4 外网网关
  • Zookeeper-数据结构
  • 优化Cocos Creator 包体体积
  • IDEA启动Web项目总是提示端口占用
  • VsCode远程ssh连接失败:Could not establish connection to XXX
  • Vue3学习体验(一)
  • Reinforced Causal Explainer for GNN论文笔记
  • python基础语法 005 函数1-2 函数作用域
  • Linux - 基础开发工具(yum、vim、gcc、g++、make/Makefile、git)
  • 使用Go编写的持续下行测速脚本,快速消耗流量且不伤硬盘
  • 【排序 】
  • 多元输出表达(MOE)
  • co模块的前端实现
  • ES6简单总结(搭配简单的讲解和小案例)
  • gitlab-ci配置详解(一)
  • Java程序员幽默爆笑锦集
  • java中具有继承关系的类及其对象初始化顺序
  • JS题目及答案整理
  • LeetCode18.四数之和 JavaScript
  • Logstash 参考指南(目录)
  • nodejs调试方法
  • React as a UI Runtime(五、列表)
  • SpiderData 2019年2月13日 DApp数据排行榜
  • SpriteKit 技巧之添加背景图片
  • 二维平面内的碰撞检测【一】
  • 基于游标的分页接口实现
  • 力扣(LeetCode)21
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 想写好前端,先练好内功
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .htaccess配置常用技巧
  • .libPaths()设置包加载目录
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET企业级应用架构设计系列之技术选型
  • .NET业务框架的构建
  • [000-01-022].第03节:RabbitMQ环境搭建
  • [20160902]rm -rf的惨案.txt
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [2024-06]-[大模型]-[Ollama] 0-相关命令
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [BZOJ1008][HNOI2008]越狱