protobuf使用流程
- 定义用于文件.proto
- 使用protobuf的编译器编译消息文件
- 使用编译好对应语言的类文件进行消息的序列化与反序列化
新增依赖
核心依赖
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.6.1</version>
</dependency>
增加json格式的pb文件支持
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.6.1</version>
</dependency>
<dependency>
<groupId>com.googlecode.protobuf-java-format</groupId>
<artifactId>protobuf-java-format</artifactId>
<version>1.2</version>
</dependency>
protobuf文件语法
proto文件定义字段与java基本类型对应字段
.proto Type | Java Type |
---|---|
double | double |
float | float |
int32 | int |
int64 | int |
uint32 | int |
uint64 | long |
sint32 | int |
sint64 | long |
fixed32 | int |
fixed64 | long |
sfixed32 | int |
sfixed64 | long |
bool | boolean |
string | String |
bytes | Byte/String |
map<T,T> | java.util.Map<T,T> |
定义一个商品proto文件
//指定protobuf语法版本
syntax = "proto3";
//包名
option java_package = "com.myredis.product.proto";
//源文件类名
option java_outer_classname = "Product1";
message ProductMsg{
int32 id = 1;
string name = 2;
map<string,string> des = 3;
string image = 4;
float price = 5;
int32 num = 6;
int64 created = 7;
int64 updated = 8;
}
生成java文件
下载地址:
https://github.com/google/protobuf/releases
选择protoc-xxx-win32.zip下载
环境变量配置:
将protoc.exe配置到系统变量中
生成java文件
在所使用的proto文件路径下打开cmd窗口执行以下命令:
protoc -I=源地址 --java_out=目标地址 源地址/xxx.proto
如:
protoc -I=D:\protobuf --java_out=D:\IDEAproject\Product\src\main\java product.proto
看到生成的java文件
package com.myredis.product.proto;
public final class Product {
private Product() {}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistryLite registry) {
}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistry registry) {
registerAllExtensions(
(com.google.protobuf.ExtensionRegistryLite) registry);
}
...
定义proto文件序列化与反序列化配置文件
@Configuration
public class ProtoConfig {
/**
* protobuf序列化
*/
@Bean
ProtobufHttpMessageConverter protobufHttpMessageConverter(){
return new ProtobufHttpMessageConverter();
}
/**
* protobuf反序列化
*/
@Bean
RestTemplate restTemplate(ProtobufHttpMessageConverter protobufHttpMessageConverter){
return new RestTemplate(Collections.singletonList(protobufHttpMessageConverter));
}
}
测试proto文件序列化与反序列化
在测试类中新建proto文件数据并模拟proto文件以post请求方式传输
@Test
public void sendMessageTest() throws Exception{
URI uri = new URI("http",null,"127.0.0.1",8080,"/product/getProto","",null);
HttpPost request = new HttpPost(uri);
MessageProduct.ProductMsg.Builder builder = MessageProduct.ProductMsg.newBuilder();
builder.setId(123456);
builder.setName("联想电脑");
HttpResponse response = HttpUtils.doPost(request, builder.build());
}
启动项目并通过测试类看到序列化数据结果
@RequestMapping(value = "getProto",produces = "application/x-protobuf")
@ResponseBody
public Product getProduct(@RequestBody MessageProduct.ProductMsg msg){
System.out.println(msg.getId());
System.out.println(msg.getName());
return null;
}
看到控制台序列化后输出的结果