Protostuff使用示例

  • 2018.5.17
  • 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。

1、引入Maven依赖的JAR包

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

2、编写需要被序列化的实体类

这里是User.java(成员属性包含了其它类)

package demo.protostuff;import java.util.List;public class User {private String firstName;private String lastName;private String email;private List<User> friends;private List<Car> cars;public User() {}public User(String email) {this.email = email;}// getters and setterspublic String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public List<User> getFriends() {return friends;}public void setFriends(List<User> friends) {this.friends = friends;}public List<Car> getCars() {return cars;}public void setCars(List<Car> cars) {this.cars = cars;}@Overridepublic String toString() {return "User{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", email='" + email+ '\'' + ", friends=" + friends + ", cars=" + cars + '}';}
}

Car.java

package demo.protostuff;public class Car {private String color;private String car_name;private Integer price;public String getColor() {return color;}public void setColor(String color) {this.color = color;}public String getCar_name() {return car_name;}public void setCar_name(String car_name) {this.car_name = car_name;}public Integer getPrice() {return price;}public void setPrice(Integer price) {this.price = price;}public Car(String car_name) {super();this.car_name = car_name;}public Car() {super();}@Overridepublic String toString() {return "Car [color=" + color + ", car_name=" + car_name + ", price=" + price + "]";}}

3、主程序类

这里是App.java

package demo.protostuff;import java.util.ArrayList;
import java.util.List;import io.protostuff.LinkedBuffer;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.runtime.RuntimeSchema;public class App {private static RuntimeSchema<User> schema = RuntimeSchema.createFrom(User.class);public static void main(String[] args) {User user1 = new User();user1.setEmail("10000@qq.com");user1.setFirstName("zhang");user1.setLastName("sanfeng");List<User> users = new ArrayList<>();users.add(new User("20000@qq.com"));user1.setFriends(users);Car car1 = new Car("宾利");Car car2 = new Car("法拉利");List<Car> cars = new ArrayList<>();cars.add(car1);cars.add(car2);user1.setCars(cars);byte[] bytes = ProtostuffIOUtil.toByteArray(user1, schema,LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));User user2 = schema.newMessage();ProtostuffIOUtil.mergeFrom(bytes, user2, schema);System.out.println(user2);System.out.println();// 使用自定义的工具类byte[] bytes1 = ProtostuffUtil.serializer(user1);User newUser = ProtostuffUtil.deserializer(bytes1, User.class);System.out.println(newUser);}
}

程序说明:

  • RuntimeSchema类用于在运行时从Java实体对象中生成所需的模式Schema
  • ProtostuffIOUtil是一个工具类,用于对消息或对象进行序列化/反序列化
  • LinkedBuffer是一个缓冲区类,它封装了字节数组并具有对下一个缓冲区的引用以便能动态增加容量。

执行程序,输出如下:

User{firstName=’zhang’, lastName=’sanfeng’, email=’10000@qq.com’, friends=[User{firstName=’null’, lastName=’null’, email=’20000@qq
.com’, friends=null, cars=null}], cars=[Car [color=null, car_name=宾利, price=null], Car [color=null, car_name=法拉利, price=null]]}

User{firstName=’zhang’, lastName=’sanfeng’, email=’10000@qq.com’, friends=[User{firstName=’null’, lastName=’null’, email=’20000@qq
.com’, friends=null, cars=null}], cars=[Car [color=null, car_name=宾利, price=null], Car [color=null, car_name=法拉利, price=null]]}

4、根据Protostuff库自行封装的工具类

这里是ProtostuffUtil.java

package demo.protostuff;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;import io.protostuff.LinkedBuffer;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema;public class ProtostuffUtil {private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<Class<?>, Schema<?>>();private static <T> Schema<T> getSchema(Class<T> clazz) {@SuppressWarnings("unchecked")Schema<T> schema = (Schema<T>) cachedSchema.get(clazz);if (schema == null) {schema = RuntimeSchema.getSchema(clazz);if (schema != null) {cachedSchema.put(clazz, schema);}}return schema;}/*** 将对象序列化* @param obj 对象* @return*/public static <T> byte[] serializer(T obj) {@SuppressWarnings("unchecked")Class<T> clazz = (Class<T>) obj.getClass();LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);try {Schema<T> schema = getSchema(clazz);return ProtostuffIOUtil.toByteArray(obj, schema, buffer);} catch (Exception e) {throw new IllegalStateException(e.getMessage(), e);} finally {buffer.clear();}}/*** 将字节数组数据反序列化* @param data 字节数组* @param clazz 对象* @return*/public static <T> T deserializer(byte[] data, Class<T> clazz) {try {T obj = clazz.newInstance();Schema<T> schema = getSchema(clazz);ProtostuffIOUtil.mergeFrom(data, obj, schema);return obj;} catch (Exception e) {throw new IllegalStateException(e.getMessage(), e);}}
}

Protostuff使用示例相关推荐

  1. 序列化与反序列化之 Protostuff

    一 序列化与反序列化 在大型开发中,序列化与反序列化是一个常见的技术点和问题.在之前我们对序列化与反序列化有过相关描述,但并不系统,更偏重于原理介绍.这里,我们讲详细介绍序列化与反序列化的更多场景和应 ...

  2. protostuff java_protostuff

    软件简介 protostuff 是一个支持各种格式的一个序列化Java类库,包括 JSON.XML.YAML等格式. 示例代码: public class UserSchema implements  ...

  3. 使用Protostuff实现序列化与反序列化

    使用Protostuff实现序列化与反序列化 (1)Protobuf介绍 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已 ...

  4. .net连接mysql数据_.net连接MYSQL数据库的方法及示例!

    连接MYSQL数据库的方法及示例 方法一: 使用MYSQL推出的MySQL Connector/Net is an ADO.NET driver for MySQL 该组件为MYSQL为ADO.NET ...

  5. CPU Cache原理与示例

    CPU Cache原理与示例 基础知识 现在的 CPU 多核技术,都会有几级缓存,老的 CPU 会有两级内存(L1 和 L2),新的CPU会有三级内存(L1,L2,L3 ),如下图所示: 其中:  ...

  6. 编译器 llvm clang 源码转换示例

    编译器 llvm clang 源码转换示例 从git获取llvm项目的源码方式: git clone https://github.com/llvm/llvm-project.git 下载源码后,进入 ...

  7. Cache Memory技术示例

    Cache Memory技术示例 为什么需要cache?如何判断一个数据在cache中是否命中?cache的种类有哪些,区别是什么? 为什么需要cache memory 先思考第一个问题:程序是如何运 ...

  8. Swift与LLVM-Clang原理与示例

    Swift与LLVM-Clang原理与示例 LLVM 学习 从 简单汇编基础 到 Swift 不简单的 a + 1 作为iOS开发,程序崩溃犹如家常便饭,秉着没有崩溃也要制造崩溃的原则 每天都吃的很饱 ...

  9. C语言与OpenCL的编程示例比较

    C语言与OpenCL的编程示例比较 OpenCL支持数据并行,任务并行编程,同时支持两种模式的混合.对于同步 OpenCL支持同一工作组内工作项的同步和命令队列中处于同一个上下文中的 命令的同步. 在 ...

最新文章

  1. 栈、堆、方法区之间的关系
  2. 《动手玩转Arduino》——2.4 展望
  3. 北大poj1018题解题报告
  4. 用python画面积图_Python笔记:用matplotlib绘制面积图
  5. 地铁框架保护的原理_继电保护的基础知识和原理(地铁)
  6. [Javascript]史上最短的IE浏览器判断代码
  7. phonegap 总结
  8. 发那科机器人寄存器Ar_浅谈发那科机器人与TP参数之间的关系
  9. 「运维有小邓」三款性价比超高的AD域管理工具
  10. 服务器------sz命令 – 从Linux上下载文件到本地
  11. C语言基础期末复习题(带详解答案)
  12. java项目tkmybatis整合_springboot集成tk mybatis
  13. wenz ces123
  14. [笑话]1+1等于几?(新版)
  15. 计算机算样本标准偏差,计算器中的总体标准差和样本标准差有什么区别
  16. 数据接口-免费版(股票数据API)
  17. 3d打印材料有哪几种
  18. 莫名奇妙的异常010:Unexpected server response (0) while retrieving PDF
  19. 计算机功能清单,如何使用印象笔记的清单功能?清单快速上手教程
  20. go: cannot find main module, but found .git/config in

热门文章

  1. 公司建设网站的好处及优势
  2. 【转载】我们要做不完美的自己
  3. 微信小程序-如何禁止表单二次提交?如何实现幂等?【亲测有效,超级详细,附源码】
  4. PRIMARY KEY联合主键
  5. 【智能物流】德勤|《中国智慧物流发展报告》(全文)
  6. 计算机视觉领域论文投稿
  7. 吴恩达深度学习笔记-损失函数和成本函数
  8. 493 Reverse Pairs
  9. win10录屏_一分钟教你学会两种电脑录屏方法,以后别再说不知道了
  10. MapReduce实现之 查找共同好友