1.需求
使用ProtoBuff序列化
2.详解
1. ProtocolBuffer是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化。
2.它很适合做数据存储或数据交换格式。
3.可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API
protobuf协议是以一个 .proto 后缀的文件为基础,这个文件描述了存在哪些数据,数据类型是怎么样的
修饰符
- required : 不可以增加或删除的字段,必须初始化;
- optional : 可选字段,可删除,可以不初始化;
- repeated : 可重复字段, 对应到java文件里,生成的是List。
3.举个栗子
pom文件
<dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.0.8</version> </dependency> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-runtime</artifactId> <version>1.0.8</version> </dependency>
Student类
package com.serializable; public class Student { private String id; private String username; private String password; public Student() { } public Student(String id, String username, String password) { this.id = id; this.username = username; this.password = password; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", password=" + password + "]"; } }
序列化工具类
import com.dyuproject.protostuff.LinkedBuffer; import com.dyuproject.protostuff.ProtobufIOUtil; import com.dyuproject.protostuff.runtime.RuntimeSchema; public class SerializeUtils { public static <T> byte[] serialize(T t,Class<T> clazz) { return ProtobufIOUtil.toByteArray(t, RuntimeSchema.createFrom(clazz), LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)); } public static <T> T deSerialize(byte[] data,Class<T> clazz) { RuntimeSchema<T> runtimeSchema = RuntimeSchema.createFrom(clazz); T t = runtimeSchema.newMessage(); ProtobufIOUtil.mergeFrom(data, t, runtimeSchema); return t; } }
测试代码
@Test public void Protobuf() { Student student=new Student("1","村长","123456"); System.out.println("序列化"); byte[] data = SerializeUtils.serialize(student,Student.class); for (byte b : data) { System.out.print(b); } System.out.println(); System.out.println("反序列化"); Student student2 = SerializeUtils.deSerialize(data,Student.class); System.out.println(student2); }