本文共 2479 字,大约阅读时间需要 8 分钟。
Protocol Buffer 和 XML、JSON一样都是结构数据序列化的工具,但它们的数据格式有比较大的区别:
通过将结构化的数据(拥有多种属性)进行序列化,从而实现(内存与硬盘之间)数据存储和交换的功能(这个东西的使用除非修改原有的数据结构否则几乎不会改动,就是获取对象类属性和设置对象属性)
.proto
协议文件将数据结构或对象
转换成二进制流
的过程二进制流
转换成数据结构或对象
的过程
目前实现方式有2种:
先定义.proto文件,然后编译成javabean. 在序列化和反序列化.~~~~这个很简单
public class Test { public static void main(String[] args) throws IOException { UserOuterClass.User.Builder userBuilder = UserOuterClass.User.newBuilder(); userBuilder.setName("子悠"); userBuilder.setAge(18);// userBuilder.setComment("this is comment"); System.out.println("\n**********************序列化*****************************"); byte[] bytes = userBuilder.build().toByteArray(); System.out.println("bytes length is " + bytes.length); for (int i = 0; i < bytes.length; i++) { System.out.print(bytes[i] + " "); } System.out.println("\n**********************反序列化*****************************"); UserOuterClass.User user = UserOuterClass.User.parseFrom(bytes); System.out.println(user.getName()); }}
//指定版本 syntax = "proto2"; //定义包名 package com.test.model; // 生成的包名option java_package="com.pancm.protobuf";//生成的java名//注:这里使用的是proto3,相关的注释我已写了,这里便不再过多讲述了。需要注意一点的是proto文件和生//成的Java文件名称不能一致!option java_outer_classname = "UserInfo";//定义结构数据 message User { //必选字段 第1个属性 required string name = 1; //必选字段 第2个属性 required int32 age = 2; //可选字段 第3个属性 optional string comment = 3; }
.proto Type | Java Type |
---|---|
double | double |
float | float |
int32 | int |
int64 | int |
uint32 | int |
uint64 | long |
sint32 | int |
sint64 | long |
fixed32 | int |
fixed64 | long |
sfixed32 | int |
sfixed64 | long |
bool | boolean |
string | String |
bytes | Byte/String |
map<T,T> | java.util.Map<T,T> |
把.proto文件和protoc.exe(生成Java文件的软件)放到E盘目录下的protobuf文件夹下,然后再到该目录的dos界面下输入:protoc.exe --java_out=文件绝对路径名称
。
protoc.exe --java_out=E:\protobuf Test.proto
转载地址:http://xbcmf.baihongyu.com/