Protocol Buffers 是一種輕便高效的結構化數據存儲格式,能夠用於結構化數據串行化,或者說序列化。它很適合作數據存儲或 RPC 數據交換格式。可用於通信協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式,被普遍應用在網絡傳輸java
Varint編碼數據庫
ZigZag編碼bash
字符串類型
字符串等則採用相似數據庫中的 varchar 的表示方法,即用一個 varint 表示長度,而後將其他部分緊跟在這個長度部分以後便可網絡
key的計算方式maven
wireTypeui
源碼展現google
/** Makes a tag value given a field number and wire type. */
static int makeTag(final int fieldNumber, final int wireType) {
return (fieldNumber << TAG_TYPE_BITS) | wireType;
}
複製代碼
TAG_TYPE_BITS取值爲3,也就是低位爲wire_type,高位爲field_number,舉例說明:age聲明爲int32,age的field_number=1,因此wire_type =0,因此key=(1<<3 | 0 )=0x08編碼
protobuf文件spa
syntax ="proto3";
package com.simple;
option java_package="com.simple";
option java_outer_classname="Person";
message Person{
int32 age= 1;
}
複製代碼
序列化插件
Person.Builder builder = Person.newBuilder();
builder.setAge(18);
Person person =builder.build();
byte[] byteArray = person.toByteArray();
FileOutputStream outstream = new FileOutputStream(new File("Person.txt"));
outstream.write(byteArray);
outstream.close();
複製代碼
打開Person.txt,使用十六進制查看:08 12
概要
protobuf提供了maven插件,能夠利用插件生成對應的文件,如Java,能夠生成對應的Java類,具體使用方法,這裏再也不累贅介紹
protobuf文件
syntax = "proto3";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; } 複製代碼
maven依賴
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.5.0</version>
</dependency>
複製代碼
maven配置protobuf插件
<!-- protobuf 編譯組件 -->
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.1</version>
<extensions>true</extensions>
<configuration>
<pluginId>grpc-java</pluginId>
<protocArtifact>com.google.protobuf:protoc:3.5.0:exe:${os.detected.classifier}</protocArtifact>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.16.1:exe:${os.detected.classifier}</pluginArtifact>
<protoSourceRoot>${project.basedir}/src/main/resources/proto</protoSourceRoot>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
複製代碼