您的位置:首页 > Web前端

Protocol Buffer for Java快速入门

2016-06-26 11:02 309 查看
Protocol Buffer它是谷歌内部用的一种高效的、可扩展的对结构化数据进行编码的格式规范。是一个用来序列化结构化数据的技术,支持多种语言诸如C++、Java以及Python语言,可以使用该技术来持久化数据或者序列化成网络传输的数据。相比较一些其他的XML技术而言,该技术的一个明显特点就是更加节省空间(以二进制流存储)、速度更快以及更加灵活。

一:编写proto文件

Account.proto

package entity;

option java_package = "com.pp.entity";
option java_outer_classname = "AccountEntity";

message Account {
required int32 id = 1;
required string account = 2;
required string password = 3;
optional string nickname = 4;
required string sex = 5;
optional int32 status = 6 [default = 0];
}

在文件定义中,每个字段都有唯一的一个标识符,可以理解为索引,用于识别各个字段

id=1,account=2,password=3等 并不是默认值
默认值可以这样设置:optional int32 status = 6 [default = 0];

备注:限定修饰符 required ,optional ,repeated

required: 表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段的意思。

optional:表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值。

repeated:表示该字段可以包含0~N个元素。其特性和optional一样,但是每一次可以包含多个值,在Java里面对应的是java.util.List类型。

二:下载用于生成源代码的程序

我这里下载win版本的,下载地址:https://github.com/google/protobuf/releases

我这里下载最新稳定版 protoc-2.6.1-win32.zip

解压后,执行

protoc.exe --java_out=.  Account.proto

之后会在当前目录生成java的源代码,com.pp.entity目录,拷贝这个目录到ide的src目录

三:运行

首先在项目里面加入protobuf的依赖,注意版本需要和上面下载的保持一致

<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.6.1</version>
</dependency>
package com.pp.entity;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;

import com.pp.entity.AccountEntity.Account;

public class App {
/**
* 序列化
*/
public static void write() throws Exception {
Account.Builder builder = Account.newBuilder();
builder.setId(1);
builder.setAccount("admin");
builder.setPassword("123456");
builder.setNickname("Administrator");
builder.setSex("M");

byte[] info = builder.build().toByteArray();
try(OutputStream out = new FileOutputStream("d:/tmp/account.bin")){
out.write(info);
}
}
/**
* 反序列化
*/
public static void read() throws Exception {
try(FileInputStream fis = new FileInputStream("d:/tmp/account.bin")) {
byte[] data = new byte[fis.available()];
fis.read(data);

Account account = AccountEntity.Account.parseFrom(data);
System.out.println("id : " + account.getId());
System.out.println("account : " + account.getAccount());
System.out.println("password : " + account.getPassword());
System.out.println("nickname : " + account.getNickname());
System.out.println("sex : " + account.getSex());
System.out.println("status : " + account.getStatus());
}
}

public static void main(String[] args) throws Exception {
write();
read();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Protocol Buffer