【ProtoBuf】

387 阅读2分钟

概要

Protobuf全称是Google Protocol Buffer,是一种高效轻便的结构化数据存储方式,可用于(数据)通信协议、数据存储等。 也可以理解为结构化数据的序列化方法,可简单类比为XML(这里主要是指在数据通信和数据存储这些应用场景中序列化方面的类比,但个人认为XML作为一种扩展标记语言和Protobuf还是有着本质区别的),其具有以下特点:

  • 语言无关,平台无关

    Protobuf支持Java, C++, Python等多种语言,支持多个平台。

  • 高效

    比XML更小(3~10倍),更快(20 ~ 100倍),更为简单。

  • 扩展性,兼容性好

    你可以更新数据结构,而不影响和破坏原有的旧程序

对比 JSON XML ProtoBuf

对比有两个维度,一个是数据结构化,一个是数据序列化。这里的数据结构化主要面向开发或业务层面,数据序列化面向通信或存储层面,当然数据序列化也需要“结构”和“格式”,所以这两者之间的区别主要在于面向领域和场景不同,一般要求和侧重点也会有所不同。数据结构化侧重人类可读性甚至有时会强调语义表达能力,而数据序列化侧重效率和压缩

  • XML、JSON、ProtoBuf 都具有数据结构化和数据序列化的能力
  • XML、JSON 更注重数据结构化,关注人类可读性和语义表达能力。ProtoBuf 更注重数据序列化,关注效率、空间、速度,人类可读性差,语义表达能力不足(为保证极致的效率,会舍弃一部分元信息)
  • ProtoBuf 的应用场景更为明确,XML、JSON 的应用场景更为丰富。

spring boot集成ProtoBuf

 <dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.11.4</version>
</dependency>
<dependency>
    <groupId>com.googlecode.protobuf-java-format</groupId>
    <artifactId>protobuf-java-format</artifactId>
    <version>1.4</version>
</dependency>
  • 编写.proto文件
syntax = "proto3";
option java_package = "com.ouyaji.gateway.proto";
option java_outer_classname = "GatewayRequestEntity";

import "google/protobuf/any.proto";

message GatewayRequest {
    repeated google.protobuf.Any body  = 1;
    string method = 2;
    string uri = 3;
    map<string, string> headers = 4;
}
  • 编译生成java文件
protoc --java_out=输出文件目录  ./proto/GatewayRequestEntity.proto