Protostuff 序列化

本文介绍了一种名为protostuff的java工具,它能够简化protobuf的开发流程,通过加入maven依赖、定义bean、测试使用三个步骤即可实现序列化和反序列化的功能,相比protobuf生成的代码量更少,提高了可读性。

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);


    }

}


说明:

这里只是一个简单的例子,别的可以去官网学习:

http://www.protostuff.io/



转载于:https://my.oschina.net/u/725800/blog/530415

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值