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>
复制代码