java序列化之ProtoBuff

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

猜你喜欢

转载自my.oschina.net/u/1398304/blog/1808692