Protostuff 序列化

protostuff 是簡化protobuf開發的java的操做工具jar 。java


先看看 protobuf 的使用流程:


1.先編寫proto文件格式,例如web

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類的相關函數進行序列化和反序列化
maven

//序列化  
Person person = builder.build();  
byte[] buf = person.toByteArray();  
//反序列化  
Person person2 = PersonProbuf.Person.parseFrom(buf);

上面的流程看似很方便了,有什麼問題呢?還能不能再改進呢?咱們先看看生成的Person類代碼吧,居然有幾千行。
實際上咱們只是包含了3個變量而已,可讀性大大下降了。其次,開發過程每次都得藉助外部的編譯工具來生成代碼。ide


若是採用上面的 protobuf ,須要先編寫proto文件,而後經過protoc進行編譯,將生成的代碼引入到咱們java工程中,若是咱們採用protostuff的形式,咱們能夠免去上面的過程,具體以下:函數


protostuff 使用流程:

一、加入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>


二、定義一個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 +
                '}';
    }
}


三、測試使用:

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/
測試

相關文章
相關標籤/搜索