Protobuf的简要介绍及使用详解

一、protobuf的应用场景

在官方文档中可以看到

protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。 Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单

可以看到protobuf 与json相比具有 压缩比高 、解压缩速度更快的优点

二、protobuf的使用

protobuf在使用上较为复杂,过程可以分为以下几步:

  • 编写java 的POJO类
  • 通过工具将java的POJO类,生成protobuf数据格式下的(在idea中可以下载Pojo2Proto插件)
  • 新建一个以.proto的文件,并写入Pojo2Proto插件生成数据
  • 通过proto.exe程序将.proto文件编译生成java类,该JAVA类中定义有PB对该类的数据格式定义、get/set操作、解/压锁数据的方法

POJO类数据:

public class Entity {
  private String key;
  private String value;
  public String getKey() {
    return key;
  }
  public void setKey(String key) {
    this.key = key;
  }
  public String getValue() {
    return value;
  }
  public void setValue(String value) {
    this.value = value;
  }
}

生成的protobuf的数据:

syntax = "proto3";

message Entity {
  string key = 1;
  string value = 2;
}

通过protoc.exe进行编译

在proto.exe的下载地址 https://repo1.maven.org/maven2/com/google/protobuf/protoc/ 编译Entity.proto文件

protoc-3.9.2-windows-x86_64.exe  ./src/main/proto/Entity.proto --java_out=./src/main/java/src/

编译后生成有 Entity OuterClass类的文件     通过 Entity OuterClass类压缩数据

StreamWrap.Entity.Builder builder = StreamWrap.Entity.newBuilder();
//构造数据
builder.setKey("123");
builder.setValue("123");
StreamWrap.Entity entity = builder.build();
//将该PB类转换为二进制数据格式
byte[] buff = entity.toByteArray();

通过EntityOuterClass类解压缩数据

总结

到此这篇关于Protobuf的简要介绍及使用的文章就介绍到这了,更多相关Protobuf使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-10-13

Android中使用protobuf的具体示例

简介 Google Protocol Buffers 简称 Protobuf,类似 json 或 XML,是一种序列化结构数据的机制,但是比它们更小.更快.更简单.同时支持多语言,跨平台. 目前主要有两个大版本:proto2 和 proto3. 其中 proto2 支持 Java.Python. Objective-C.和 C++. proto3 增加了对Go.JavaNano.Ruby.和 C#的支持. proto例子 syntax = "proto3"; package tutor

在go语言中安装与使用protobuf的方法详解

简介 本文主要给大家介绍了关于go语言安装使用protobuf的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. protobuf是Google开发出来的一个语言无关.平台无关的数据序列化工具,在rpc或tcp通信等很多场景都可以使用.通俗来讲,如果客户端和服务端使用的是不同的语言,那么在服务端定义一个数据结构,通过protobuf转化为字节流,再传送到客户端解码,就可以得到对应的数据结构.这就是protobuf神奇的地方.并且,它的通信效率极高,"一条消息数据,用pr

C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信

首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Unity中, 创建网络传输的模型类: using System; using ProtoBuf; //添加特性,表示可以被ProtoBuf工具序列化 [ProtoContract] public class NetModel { //添加特性,表示该字段可以被序列化,1可以理解为下标 [ProtoMem

vue中使用protobuf的过程记录

由于目前公司采用了ProtoBuf做前后端数据交互,进公司以来一直用的是公司大神写好的基础库,完全不了解底层是如何解析的,一旦报错只能求人,作为一只还算有钻研精神的猿,应该去了解一下底层的实现,在这里记录一下学习过程. Protobuf简单介绍 Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关.语言无关.可扩展,可用于通讯协议和数据存储等领域. 有几个优点: 1.平台无关,语言无关,可扩展: 2.提供了友好的动态库,使用简单; 3

详解vue中使用protobuf踩坑记

官方解释为: Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source c

详解nginx basic auth配置踩坑记

nginx的basic auth配置由ngx_http_auth_basic_module模块提供,对HTTP Basic Authentication协议进行了支持,用户可通过该配置设置用户名和密码对web站点进行简单的访问控制. basic auth配置示例: location / { auth_basic "closed site"; auth_basic_user_file conf/htpasswd; } 说明: auth_basic可设置为off或其它字符串,为off时表示

详解Vue中使用Axios拦截器

需求是拦截前端的网络请求和相应. 废话不多说,直接上干货. 我用的是vue-cli3所以这个config文件是我自己创建的. 先介绍env.js //根据不同的环境更改不同的baseUrl let baseUrl = ''; //开发环境下 if (process.env.NODE_ENV == 'development') { baseUrl = ''; } else if (process.env.NODE_ENV == 'production') { baseUrl = '生产地址'; }

详解vue中使用微信jssdk

首先,确保你安装了weixin-js-sdk. 如果还没有安装  npm install weixin-js-sdk 在页面中 import wx from 'weixin-js-sdk'; 接下来,就需要在mounted里面进行wx.config()了. 由于使用微信js需要进行授权配置,所以需要使用ajax请求从服务端获取微信jssdk的授权参数,ajax请求我这里使用的axios this.axios({ method: 'post', url: 'http://my.service.co

详解vue中computed 和 watch的异同

一.computed 和 watch 都可以观察页面的数据变化.当处理页面的数据变化时,我们有时候很容易滥用watch. 而通常更好的办法是使用computed属性,而不是命令是的watch回调. 这里我直接引用vue官网的例子来说明: html: 我们要实现 第三个表单的值 是第一个和第二个的拼接,并且在前俩表单数值变化时,第三个表单数值也在变化 <div id="myDiv"> <input type="text" v-model="

详解Vue中watch的高级用法

假设有如下代码: <div> <p>FullName: {{fullName}}</p> <p>FirstName: <input type="text" v-model="firstName"></p> </div> new Vue({ el: '#root', data: { firstName: 'Dawei', lastName: 'Lou', fullName: '' },

详解vue中axios的使用与封装

分享下我自己的axios封装 axios是个很好用的插件,都是一些params对象,所以很方便做一些统一处理 当然首先是npm安装axios 很简单$ npm install axios --save 在src下新建文件夹 service / index.js 接着上代码 import axios from 'axios'; import { Toast} from 'mint-ui';// 我用的mint的框架来弹出我的错误返回 大家可以用别的提示 import router from '..

详解Vue中组件的缓存

之前在<Vue一个案例引发的动态组件与全局事件绑定总结>这篇文章中简单提到过组件的缓存.当时只是简单的提供了一个解决问题的思路,并没有说到多少组件缓存的东西,今天我们就来详细说说组件的缓存. 组件化开发模式下,我们会把整个项目拆分成很多组件,然后按照合理的方式组织起来. 自然就存在组件之间的切换问题,Vue 中有个「动态组件」的概念,它能够让我们更好的实现组件的切换. 在实际的项目开发中,产品是不可能放过我们的,需求总是在不停的变化,如果你碰到那些不改需求的产品就嫁了吧,太难得了. 最近项目中

详解vue中移动端自适应方案

方案1: 直接引入js  (自己 写的动态改变fontsize的js) function htRem() { var ww = document.documentElement.clientWidth; if (ww > 750) { ww = 750; } document.documentElement.style.fontSize = ww / 7.5 + "px"; } htRem(); window.onresize = function() { htRem(); };

详解Vue中使用插槽(slot)、聚类插槽

一.基本的插槽 这里总结两点 如果不在子组件中使用插槽(slot),那么在子组件中写任何代码都是无效的的,不会显示 (插槽默认值)如果子组件中没有插入任何代码的话就会显示组件插槽中的内容 slot 代表父组件往子组件中 插入的标签 这里就代表组件子组件中的 <p>Dell</p> <child> <p>Dell</p> </child> 这里如果是这样的 <child> </child> 就会显示 <sl