Google Protocol Buffer (Protobuf for short) is a lightweight and efficient structured data storage format that is platform-independent, language-independent, and extensible, and can be used in communication protocols and data storage fields.
Framework git address: https://github.com/google/protobuf
Protobuf message definition:
syntax="proto2"; //Compiler version: proto2, proto3 package com.seasy.proto; // package name import "article.proto"; //Import other proto files 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{ //The enumeration value must be an integer greater than or equal to 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 can only be used for fields of repeated numeric type, making it more efficient to encode required float price = 8; map<string, Project> projects = 9; reserved 90, 100, 120 to 150; // reserved number label, will not be used extensions 100 to 1000; //Numbering labels for third-party extensions }
Common data types: double, float, int32, int64, bool, string, bytes
Compile proto file
protoc --java_out=./output ./PrintDatamatrix.proto
protoc --cpp_out=./output ./PrintDatamatrix.proto
example:
proto file definition
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 use (sender)
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 use (receiver)
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)); }