Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议和数据存储等领域。
框架git地址: https://github.com/google/protobuf
Protobuf消息定义:
syntax="proto2"; //编译器版本: proto2, proto3 package com.seasy.proto; //包名 import "article.proto"; //导入其他proto文件 message PrintDatamatrix{ required string title = 1; required int32 width = 2 [default=100]; required int32 height = 3 [default=100]; required bytes bitmap = 4; optional string file_path = 5; enum PhoneType{ //枚举值必须大于等于0的整数 MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber{ optional string number = 1;
required PhoneType type = 2 [default=WORK]; } repeated PhoneNumber phone = 6; repeated int32 article_numberofwords = 7 [packed=true]; //packed只能用于repeated数值类型的字段,使其更有效的encode required float price = 8; map<string, Project> projects = 9; reserved 90, 100, 120 to 150; //保留的编号标签,不会被使用 extensions 100 to 1000; //供第三方扩展用的编号标签 }
常用的数据类型: double, float, int32, int64, bool, string, bytes
编译proto文件
protoc --java_out=./output ./PrintDatamatrix.proto
protoc --cpp_out=./output ./PrintDatamatrix.proto
范例:
proto文件定义
syntax="proto2"; package com.seasy.proto; option java_outer_classname = "PrintDatamatrix"; message PrintDatamatrixDT{ enum PhoneType{ MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber{ required PhoneType type = 2 [default=MOBILE]; optional string number = 1; } required string title = 1; required int32 width = 2 [default=100]; required int32 height = 3 [default=100]; required bytes bitmap = 4; optional string file_path = 5; optional bool auto_show = 6; optional double price = 7; optional float salary = 8; repeated PhoneNumber phone = 9; repeated int32 article_number = 10 [packed=true]; map<string, int64> projects = 11; }
java使用(发送端)
PrintDatamatrix.PrintDatamatrixDT.Builder builder = PrintDatamatrix.PrintDatamatrixDT.newBuilder();
builder.setTitle("title");
builder.setWidth(100);
builder.setHeight(100);
builder.setBitmap(ByteString.copyFrom("123456", Charset.forName("UTF-8")));
builder.setFilePath("");
builder.setAutoShow(true);
builder.setPrice(1.0);
builder.setSalary(1.0F);
PrintDatamatrix.PrintDatamatrixDT.PhoneNumber.Builder phoneNumberBuilder = PrintDatamatrix.PrintDatamatrixDT.PhoneNumber.newBuilder();
phoneNumberBuilder.setNumber("123");
phoneNumberBuilder.setType(PhoneType.HOME);
builder.addPhone(phoneNumberBuilder);
builder.addPhone(PrintDatamatrix.PrintDatamatrixDT.PhoneNumber.newBuilder().setNumber("456").setType(PhoneType.WORK));
builder.addArticleNumber(1);
builder.addArticleNumber(2);
builder.putProjects("p1", 1);
builder.putProjects("p2", 2);
byte[] dataBytes = builder.build().toByteArray();
java使用(接收端)
PrintDatamatrix.PrintDatamatrixDT dt = PrintDatamatrix.PrintDatamatrixDT.parseFrom(dataBytes);
System.out.println(dt.getTitle());
System.out.println(dt.getWidth());
System.out.println(dt.getHeight());
System.out.println(dt.getBitmap().toStringUtf8());
System.out.println(dt.getFilePath());
System.out.println(dt.getAutoShow());
System.out.println(dt.getPrice());
System.out.println(dt.getSalary());
for(PhoneNumber pn : dt.getPhoneList()){
System.out.println(pn.getNumber() + ", " + pn.getType().name());
}
for(Integer i : dt.getArticleNumberList()){
System.out.println(i);
}
for(Iterator<String> it=dt.getProjectsMap().keySet().iterator(); it.hasNext();){
String key = it.next();
System.out.println(key + "=" + dt.getProjectsMap().get(key));
}