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]; }
默认值可以这样设置: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(); } }