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;
}

看到控制台序列化后输出的结果
Springboot+protocolbuffer学习加测试用例

相关文章:

  • 2022-01-16
  • 2021-12-25
  • 2021-04-26
  • 2022-02-21
  • 2022-12-23
  • 2022-01-04
  • 2022-12-23
猜你喜欢
  • 2022-02-12
  • 2022-12-23
  • 2021-12-09
  • 2022-12-23
  • 2021-06-10
  • 2021-12-07
  • 2021-11-24
相关资源
相似解决方案