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); } }
说明:
这里只是一个简单的例子,别的可以去官网学习:
时间: 2024-10-09 20:47:56