protostuff 是简化protobuf开发的java的操作工具jar 。
先看看 protobuf 的使用流程:
1.先编写proto文件格式,例如
message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}
2.运行编译程序,生成实体类Person.java
protoc --java_out=./src ./person.proto
3.在程序中可以直接使用Person类的相关函数进行序列化和反序列化
//序列化
Person person = builder.build();
byte[] buf = person.toByteArray();
//反序列化
Person person2 = PersonProbuf.Person.parseFrom(buf);
上面的流程看似很方便了,有什么问题呢?还能不能再改进呢?我们先看看生成的Person类代码吧,竟然有几千行。
实际上我们只是包含了3个变量而已,可读性大大降低了。其次,开发过程每次都得借助外部的编译工具来生成代码。
如果采用上面的 protobuf ,需要先编写proto文件,然后通过protoc进行编译,将生成的代码引入到我们java工程中,如果我们采用protostuff的形式,我们可以免去上面的过程,具体如下:
protostuff 使用流程:
1、加入maven依赖:
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.0.8</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.0.8</version>
</dependency>
2、定义一个User的bean:
public class User {
private String name ;
private String password;
private Long age ;
public User() {
}
public User(String name, String password, Long age) {
this.name = name;
this.password = password;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Long getAge() {
return age;
}
public void setAge(Long age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
3、测试使用:
public class ProtostuffTest {
public static void main(String[] args) {
// new User instance
User user = new User("name", "passoword", 12L);
LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
Schema<User> schema = RuntimeSchema.createFrom(User.class);
// 序列化 user 类
byte[] bytes = ProtostuffIOUtil.toByteArray(user, schema, buffer);
User t = new User();
// 将 bytes 反序列化 , 存储到 t 变量里面
ProtostuffIOUtil.mergeFrom(bytes, t, schema);
System.out.println("反序列化结果:" + t);
}
}
说明:
这里只是一个简单的例子,别的可以去官网学习: