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