当前位置:网站首页>初探Protostuff的使用[通俗易懂]
初探Protostuff的使用[通俗易懂]
2022-06-26 11:51:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
初探Protostuff的使用
最近在学习RPC,看到了一个叫做Protostuff的库,是基于谷歌Protocal Buffer的序列化库,之前了解过Protocol Buffer,对学习了一些资料后,写了个demo,记录下来。
什么是Protocol Buffer?
Protocol Buffer是谷歌出品的一种数据交换格式,独立于语言和平台,类似于json。Google提供了多种语言的实现:java、c++、go和python。对象序列化城Protocol Buffer之后可读性差,但是相比xml,json,它占用小,速度快。适合做数据存储或 RPC 数据交换格式。
Java序列化库 – Protostuff
相对我们常用的json来说,Protocol Buffer门槛更高,因为需要编写.proto文件,再把它编译成目标语言,这样使用起来就很麻烦。但是现在有了protostuff之后,就不需要依赖.proto文件了,他可以直接对POJO进行序列化和反序列化,使用起来非常简单。
实战
新建一个SpringBoot的项目,再引入Protostuff的依赖
<dependency>
<groupId>io.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>${protostuff.version}</version>
</dependency>
<dependency>
<groupId>io.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>${protostuff.version}</version>
</dependency>先编写两个POJO,再把它们嵌套起来,这里使用了lombok的@Data注解和@Builder注解,@Data可以自动生成getter setter,@Builder注解可以让我们通过更加优雅的构建者模式来创建对象。
@Data
@Builder
public class User {
private String id;
private String name;
private Integer age;
private String desc;
}@Data
@Builder
public class Group {
private String id;
private String name;
private User user;
}接下来编写Protostuff序列化工具类
public class ProtostuffUtils {
/** * 避免每次序列化都重新申请Buffer空间 */
private static LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
/** * 缓存Schema */
private static Map<Class<?>, Schema<?>> schemaCache = new ConcurrentHashMap<>();
/** * 序列化方法,把指定对象序列化成字节数组 * * @param obj * @param <T> * @return */
@SuppressWarnings("unchecked")
public static <T> byte[] serialize(T obj) {
Class<T> clazz = (Class<T>) obj.getClass();
Schema<T> schema = getSchema(clazz);
byte[] data;
try {
data = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
} finally {
buffer.clear();
}
return data;
}
/** * 反序列化方法,将字节数组反序列化成指定Class类型 * * @param data * @param clazz * @param <T> * @return */
public static <T> T deserialize(byte[] data, Class<T> clazz) {
Schema<T> schema = getSchema(clazz);
T obj = schema.newMessage();
ProtostuffIOUtil.mergeFrom(data, obj, schema);
return obj;
}
@SuppressWarnings("unchecked")
private static <T> Schema<T> getSchema(Class<T> clazz) {
Schema<T> schema = (Schema<T>) schemaCache.get(clazz);
if (Objects.isNull(schema)) {
//这个schema通过RuntimeSchema进行懒创建并缓存
//所以可以一直调用RuntimeSchema.getSchema(),这个方法是线程安全的
schema = RuntimeSchema.getSchema(clazz);
if (Objects.nonNull(schema)) {
schemaCache.put(clazz, schema);
}
}
return schema;
}
}验证序列化功能
@SpringBootApplication
public class Application implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... strings) throws Exception {
//创建一个user对象
User user = User.builder().id("1").age(20).name("张三").desc("programmer").build();
//创建一个Group对象
Group group = Group.builder().id("1").name("分组1").user(user).build();
//使用ProtostuffUtils序列化
byte[] data = ProtostuffUtils.serialize(group);
System.out.println("序列化后:" + Arrays.toString(data));
Group result = ProtostuffUtils.deserialize(data, Group.class);
System.out.println("反序列化后:" + result.toString());
}
}可以看到控制台打印出如下数据,说明序列化和反序列化成功
序列化后:[10, 1, 49, 18, 7, -27, -120, -122, -25, -69, -124, 49, 27, 10, 1, 49, 18, 6, -27, -68, -96, -28, -72, -119, 24, 20, 34, 10, 112, 114, 111, 103, 114, 97, 109, 109, 101, 114, 28]
反序列化后:Group(id=1, name=分组1, user=User(id=1, name=张三, age=20, desc=programmer))最后,代码在这里地址,欢迎star。
参考
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133960.html原文链接:https://javaforall.cn
边栏推荐
- Uncaught reflectionexception: class view does not exist
- Lintcode 130 · 堆化
- Mqtt disconnect and reconnect
- Laravel admin uses native JS to realize sound prompt and automatic playback
- 我想知道同花顺是炒股的么?在线开户安全么?
- 机器学习LDA——实验报告
- Excel operation of manual moving average method and exponential smoothing method for time series prediction
- 介紹一下實現建模中可能用到的時間序列預測之線性二次移動平均,Excel的簡單操作
- Code specification & explain in detail the functions and uses of husky, prettier, eslint and lint staged
- PC QQ hall upload update modify VersionInfo
猜你喜欢

matlab 编程实例: 如何统计元胞数组中元素的数量

APICloud 实现文档下载和预览功能

Statistical genetics: Chapter 1, basic concepts of genome

FastRCNN

11、 Box styles and user interface

Machine learning LDA - Experimental Report

Cet article présente la moyenne mobile quadratique linéaire et le fonctionnement simple d'Excel pour réaliser la prédiction des séries chronologiques dans la modélisation.

2、 MySQL Foundation

统计遗传学:第二章,统计分析概念

HUST網絡攻防實踐|6_物聯網設備固件安全實驗|實驗二 基於 MPU 的物聯網設備攻擊緩解技術
随机推荐
我想知道,十大劵商如何开户?在线开户安全么?
【概率论】条件概率、贝叶斯公式、相关系数、中心极限定理、参数估计、假设检验
Splicing full paths and uploading multiple pictures of laravel admin when laravel uses OSS
Laravel admin uses native JS to realize sound prompt and automatic playback
loggie 编码以及换行符测试
TCP面试
One click deployment of your own community forum
基于slate构建文档编辑器
十大券商有哪些?手机开户安全么?
CG骨骼动画
C language -- operators and expressions
redux相关用法
Omnichannel membership - tmall membership 1: opening tutorial
国际美妆业巨头押注中国
SolidWorks rendering tips how not to display edges -- display style settings
Ctrip ticket app KMM cross end kV repository mmkv kotlin | open source
Machine learning linear regression - Experimental Report
杜比全景音效简介
Code specification & explain in detail the functions and uses of husky, prettier, eslint and lint staged
【Redis 系列】redis 学习十六,redis 字典(map) 及其核心编码结构