Protocol Buffers
,是Google公司開發的一種數據描述語言,相似於XML可以將結構化數據序列化,可用於數據存儲、通訊協議等方面。html
它不依賴於語言和平臺而且可擴展性極強。現階段官方支持C++
、JAVA
、Python
三種編程語言,但能夠找到大量的幾乎涵蓋全部語言的第三方拓展包。java
google在2008年7月7號將其做爲開源項目對外公佈git
雖然Protocol Buffers
很早就被開源出來,被使用的頻率並無Json
和XML
多,大多數被用於遊戲開發協議,RPC
和即時通信.然而這樣的數據交換利器比Json
和XML
的利處多太多了,但更小,更快,更簡單github
該文章是繼是時候該瞭解一波Protocol Buffers了[Android]後的Java後臺SpringBoot快速集成Protocol Buffers編程
setup 1網絡
配置 protobuf
,protobuf-java-util
,protobuf-java-format
依賴app
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.googlecode.protobuf-java-format</groupId>
<artifactId>protobuf-java-format</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
複製代碼
注意:maven
protobuf-java-util
是protobuf
相關的工具類編程語言
protobuf-java-format
是能夠將protobuf
轉換爲Json
格式轉換器ide
setup 2
配置編譯器,編譯MAven插件,文件輸出環境
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<extensions>true</extensions>
<configuration>
<!--默認值-->
<protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
<!--默認值-->
<!--<outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>-->
<!--<outputDirectory>${project.build.sourceDirectory}</outputDirectory>-->
<!--設置是否在生成java文件以前清空outputDirectory的文件,默認值爲true,設置爲false時也會覆蓋同名文件-->
<clearOutputDirectory>false</clearOutputDirectory>
<!--默認值-->
<temporaryProtoFileDirectory>${project.build.directory}/protoc-dependencies
</temporaryProtoFileDirectory>
<!--更多配置信息能夠查看https://www.xolstice.org/protobuf-maven-plugin/compile-mojo.html-->
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
<!--也能夠設置成局部變量,執行compile或test-compile時才執行-->
<!--<configuration>-->
<!--<protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>-->
<!--<outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>-->
<!--<temporaryProtoFileDirectory>${project.build.directory}/protoc-dependencies</temporaryProtoFileDirectory>-->
<!--</configuration>-->
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>add-protobuf-generate-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>target/generated-sources/protobuf/java</source>
</sources>
</configuration>
</execution>
<execution>
<id>add-protobuf-generate-test-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>add-test-source</goal>
</goals>
<configuration>
<sources>
<source>target/generated-test-sources/protobuf/java</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
複製代碼
注意:
arget/generated-sources/protobuf/java
,該路徑下的java文件都是直接使用和打入jar包和war包setup 1
java項目中編寫.proto文件了.例如: 新建 Result.proto
package com.hk.protocolbuffer;
// 關注1:包名
option java_package = "com.hk.protocolbuffer";
option java_outer_classname = "Result";
// 關注2:option選項
// 關注3:消息模型
message AppResult {
optional string message = 1;
required string data = 2;
optional string version = 3;
optional string mobile = 5;
optional int32 code= 6[default = 500];
optional string email = 7;
}
複製代碼
java項目中編寫.proto文件了.例如: 新建 Demo.proto
package protocobuff_Demo;
// 關注1:包名
option java_package = "com.hk.protocolbuffer";
option java_outer_classname = "Demo";
// 關注2:option選項
// 關注3:消息模型
// 下面詳細說明
// 生成 Person 消息對象(包含多個字段,下面詳細說明)
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
複製代碼
setup 2
使用mvn clean install 命令 構建,在項目的arget/generated-sources/protobuf/java
下能找到生成的文件,收取成果
注意:
Protobuf Support
插件com\hk\protocolbuffer
目錄是option java_package
指定的包名setup 1
配置 ProtobufHttpMessageConverter
,其餘的基本配SpringBoot都自動配置好了,直接使用就能夠了
/**
* This example demonstrates serving up REST payloads encoded using Google Protocol Buffers.
*/
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Bean
ProtobufHttpMessageConverter protobufHttpMessageConverter() {
return new ProtobufHttpMessageConverter();
}
}
複製代碼
setup 2
使用舉例
@RestController
@RequestMapping("/app")
public class ApiRegisterController {
@Resource(name = "appUserService")
private AppUserService appUserService;
@PostMapping("register2")
public Demo.Person register2(@RequestBody Result.AppResult appBaseResult) throws Exception {
return Demo.Person.newBuilder().addPhone(Demo.Person.PhoneNumber.newBuilder().setNumber(appBaseResult.getData()).build()).setId(1).setName("張三").build();
}
}
複製代碼
因爲protobuf
調試比較頭痛的問題,我在網上找到了一些調試工具(歡迎補充):
第一篇-網絡篇:
第二篇-Retrofit源碼解析
第三篇-Android組件化和快速實現MVP
第三篇-是時候該瞭解一波Protocol Buffers了[Android]
第三篇-是時候該瞭解一波Protocol Buffers了[Java]
更新中....
Github:github.com/chengzichen
CSDN : blog.csdn.net/chengzichen…
我的博客 : chengzichen.github.io/