protobuf string类型_Protobuf

介绍

Google Protocol Buffer(简称Protobuf)是一种轻便、高效的结构化数据存储格式,平台无关、语言无关、可扩展、可用于通讯协议和数据存储等领域。

Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

json\xml都是基于文本格式,protobuf是二进制格式。

优势

序列化后体积比json和xml更小,适合网络传输

支持跨平台多语言

消息格式升级和兼容还不错

序列化和反序列化很快,快于json的处理速度

不足

功能简单,无法用来表示复杂概念。

通用性上不足。

不适合用来描述数据结构。

它以二进制方式存储,除非有.proto定义,否则没法直接读出protobuf的任何数据。

比较

说明

json

一般的web项目中,最流行的主要还是json。因为浏览器对于json数据支持非常友好,有很多内建的函数支持。

xml

在webservice中应用最为广泛,但是相比于json,它的数据更加冗余,因为需要成对的闭合标签。

protobuf

后起之秀,是google开源的一种数据格式,适合高性能、对响应速度有要求的数据传输场景。因为protobuf是二进制数据格式,需要编码和解码。数据本身不具有可读性。因此只能反序列化之后得到真正可读的数据。

安装

MacOS

CentOS

Ubuntu

12

> brew install protobuf

> protoc --version

12345678910111213141516171819

> yum -y install autoconf automake libtool make g++

> cd /usr/local/src/

> wget https://github.com/protocolbuffers/protobuf/releases/download/v3.12.0/protobuf-all-3.12.0.tar.gz

> tar zxvf protobuf-all-3.12.0.tar.gz

> cd protobuf-3.12.0/

> ./autogen.sh

> ./configure --prefix=/usr/local/protobuf

> make

> make check

> make install

> ldconfig

> vim /etc/profile

##### 增加如下内容 #####

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib

export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib

export PATH=$PATH:/usr/local/protobuf/bin

##### 内容结束 #####

> source /etc/profile

> protoc --version

12345678910111213141516171819

> sudo apt-get install autoconf automake libtool curl make g++ libffi-dev -y

> cd /usr/local/src/

> wget https://github.com/protocolbuffers/protobuf/releases/download/v3.12.0/protobuf-all-3.12.0.tar.gz

> tar zxvf protobuf-all-3.12.0.tar.gz

> cd protobuf-3.12.0/

> ./autogen.sh

> ./configure --prefix=/usr/local/protobuf

> make

> make check

> make install

> ldconfig

> vim /etc/profile

##### 增加如下内容 #####

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib

export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib

export PATH=$PATH:/usr/local/protobuf/bin

##### 内容结束 #####

> source /etc/profile

> protoc --version

使用

语法

syntax = "proto3";

message 消息名 {

消息体

}

示例

response.proto

// 指定protobuf的版本,proto3是最新的语法版本

syntax = "proto3";

// 定义数据结构,message 你可以想象成java的class,c语言中的struct

message Response {

string data = 1; // 定义一个string类型的字段,字段名字为data, 序号为1

int32 status = 2; // 定义一个int32类型的字段,字段名字为status, 序号为2

}

proto文件中,字段后面的序号,不能重复,定义了就不能修改,可以理解成字段的唯一ID。

分配标识号

在消息定义中,每个字段后面都有一个唯一的数字,这个就是标识号。

这些标识号是用来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变,每个消息内唯一即可,不同的消息定义可以拥有相同的标识号。

[1,15]之内的标识号在编码的时候会占用一个字节。

[16,2047]之内的标识号则占用2个字节。

所以应该为那些频繁出现的消息元素保留 [1,15]之内的标识号。

切记:要为将来有可能添加的、频繁出现的字段预留一些标识号。

保留标识号

message Foo {

reserved 2, 15, 9 to 11; // 保留2,15,9到11这些标识号

}

注释

往.proto文件添加注释,支持C/C++/java风格的双斜杠(//) 语法格式。

为消息定义包

package foo.bar;

message Open { ... }

选项

java_package 单独为java定义包名字。

java_outer_classname 单独为java定义,protobuf编译器生成的类名。

将消息编译成各种语言版本的类库

1234

##### 命令格式:

> protoc [OPTION] PROTO_FILES

##### 例子:

> protoc --java_out=. demo.proto

常用的OPTION选项:

--cpp_out=OUT_DIR 指定代码生成目录,生成 C++ 代码

--csharp_out=OUT_DIR 指定代码生成目录,生成 C# 代码

--java_out=OUT_DIR 指定代码生成目录,生成 java 代码

--js_out=OUT_DIR 指定代码生成目录,生成 javascript 代码

--objc_out=OUT_DIR 指定代码生成目录,生成 Objective C 代码

--php_out=OUT_DIR 指定代码生成目录,生成 php 代码

--python_out=OUT_DIR 指定代码生成目录,生成 python 代码

--ruby_out=OUT_DIR 指定代码生成目录,生成 ruby 代码

在代码中使用ProtoBuf对数据进行序列化和反序列化

maven:

12345

com.google.protobuf

protobuf-java

3.9.1

1234567891011121314151617

ResponseOuterClass.Response.Builder builder = ResponseOuterClass.Response.newBuilder();

// 设置字段值builder.setData("hello www.wanglibing.com");

builder.setStatus(200);

ResponseOuterClass.Response response = builder.build();

// 将数据根据protobuf格式,转化为字节数组 byte[] byteArray = response.toByteArray();

// 反序列化,二进制数据try {

ResponseOuterClass.Response newResponse = ResponseOuterClass.Response.parseFrom(byteArray);

System.out.println(newResponse.getData());

System.out.println(newResponse.getStatus());

} catch (Exception e) {

}

Golang使用protobuf

12345678910

##### 1. 安装protobuf编译器(步骤略)

##### 2. 安装protobuf包

> go get -v -u github.com/golang/protobuf/proto

##### 3. 安装protoc-gen-go插件

> go get -v -u github.com/golang/protobuf/protoc-gen-go

##### 4. 定义proto消息(步骤略)

##### 5. 不带插件编译

> protoc --go_out=./ *.proto

##### 5. 带插件编译

> protoc --go_out=plugins=grpc:./ *.proto

基本数据类型

double

float

int32 使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint64替代

uint32 使用变长编码。

uint64 使用变长编码。

sint32 使用变长编码,这些编码在负值时比int32高效的多。

sint64 使用变长编码,有符号的整型值。编码时比通常的int64高效。

fixed32 总是4个字节,如果数值总是比总是比228大的话,这个类型会比uint32高效。

fixed64总是8个字节,如果数值总是比总是比256大的话,这个类型会比uint64高效。

sfixed32 总是4个字节。

sfixed64 总是8个字节。

bool

string 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。

bytes 可能包含任意顺序的字节数据。

枚举类型

syntax = "proto3";//指定版本信息,不指定会报错

enum PhoneType //枚举消息类型,使用enum关键词定义,一个电话类型的枚举类型

{

MOBILE = 0; //proto3版本中,首成员必须为0,成员不应有相同的值

HOME = 1;

WORK = 2;

}

// 定义一个电话消息

message PhoneNumber

{

string number = 1; // 电话号码字段

PhoneType type = 2; // 电话类型字段,电话类型使用PhoneType枚举类型

}

数组类型

整数数组

message Msg {

// 只要使用repeated标记类型定义,就表示数组类型。

repeated int32 arrays = 1;

}

字符串数组

message Msg {

repeated string names = 1;

}

消息嵌套

引用其它消息类型

// 定义Result消息

message Result {

string url = 1;

string title = 2;

repeated string snippets = 3; // 字符串数组类型

}

// 定义SearchResponse消息

message SearchResponse {

// 引用上面定义的Result消息类型,作为results字段的类型

repeated Result results = 1; // repeated关键词标记,说明results字段是一个数组

}

消息嵌套

message SearchResponse {

// 嵌套消息定义

message Result {

string url = 1;

string title = 2;

repeated string snippets = 3;

}

// 引用嵌套的消息定义

repeated Result results = 1;

}

import导入其它proto文件定义的消息

result.proto

syntax = "proto3";

// Result消息定义

message Result {

string url = 1;

string title = 2;

repeated string snippets = 3; // 字符串数组类型

}

search_response.proto

syntax = "proto3";

// 导入Result消息定义

import "result.proto";

// 定义SearchResponse消息

message SearchResponse {

// 使用导入的Result消息

repeated Result results = 1;

}

map类型

map语法

map map_field = N;

key_type可以是任何整数或字符串类型(除浮点类型和字节之外的任何标量类型)。请注意,枚举不是有效的key_type。

value_type 可以是除另一个映射之外的任何类型。

map示例

syntax = "proto3";

message Product

{

string name = 1; // 商品名

// 定义一个k/v类型,key是string类型,value也是string类型

map attrs = 2; // 商品属性,键值对

}

Map 字段不能使用repeated关键字修饰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word中怎样单独删除某一页的页码

假设目标是去掉页码为4的那一页 点击第4页中的任意空行,之后点击“页面布局”选项卡中的“分隔符”,之后选择“连续” 双击页脚部分,点击第4页页眉的任意位置,之后取消掉“链接到前一条页眉” 之后第4页的页脚,第5页的…

关于 webapi ajax进度条信息设置

1、Web.config 设置跨域 <httpProtocol><customHeaders><add name"Access-Control-Allow-Origin" value"*" /><add name"Access-Control-Allow-Headers" value"Content-Type" /><add name"Access-Con…

Gartner公布五大新兴技术趋势 AI成主角

市场调研机构Gartner近日发布了2019年度《新兴技术的炒作周期(Hype Cycle)》研究报告&#xff0c;报告显示2019年有五大技术发展趋势十分突出&#xff0c;它们将对企业机构转型产生重要影响。这五大趋势分别是传感和移动、增强人类、后经典计算和通信、数字生态系统以及先进的人…

a12处理器和骁龙855_【性能】骁龙855最新跑分曝光 多核竟超苹果A12?

据之前消息&#xff0c;索尼将在2月24日开始的MWC 2019大展上推出新旗舰Xperia XZ4、Xperia XA3、XA3 Ultra三款新机&#xff0c;其中XZ4将采用21:9 FHD 分辨率的超窄“带鱼屏”&#xff0c;搭载骁龙855处理器&#xff0c;是主打旗舰&#xff0c;今日索尼Xperia XZ4最新跑分出炉…

openwrt 格式化_openwrt 挂载硬盘步骤详解

确认硬盘设备符号方法1&#xff1a;>>> ls /dev/sd*/dev/sda /dev/sdb方法2&#xff1a;>>> cat /proc/partitionsmajor minor #blocks name31 0 128 mtdblock031 1 129920 mtdblock131 2 1024 mtdblock231 …

word如何去掉标题前面的黑点

首先选中标题&#xff0c;点击 在弹出来的框框里取消“ 段中不分页 ”和“ 与下段同页 ” 此时黑点已经取消了

使用svnsync同步svn

使用svnsync实现已有版本库的镜像 svn不支持分布式开发&#xff0c;所以把svn版本库保存在一台服务器上是不安全的。制作一个镜像svn版本库有多种方式&#xff0c;我采用subversion自带的svnsync程序。 源版本库路径&#xff1a;http://192.168.0.100/svn/project 镜像版本库路…

ICLR 2019八大趋势:RNN正在失去光芒,强化学习仍最受欢迎

大数据文摘出品来源&#xff1a;huyenchip编译&#xff1a;笪洁琼、周家乐ICLR 2019过去有几天了&#xff0c;作为今年上半年表现最为亮眼的人工智能顶会共收到1591篇论文&#xff0c;录取率为31.7%。为期4天的会议&#xff0c;共有8个邀请演讲主题&#xff0c;内容包括&#x…

python中赋值语句_python中赋值语句和增强赋值语句的区别

展开全部 赋值语句是2113由赋值表达式再加上分号构成的表5261达式语句。 其一般形式为&#xff1a;4102 变量表达式; 赋值语句的功能和特1653点都与赋值表达式相同。 它是程序中使用最多的语句之一。 在赋值语句的使用中需要注意以下几点&#xff1a; 1.由于在赋值符“”右边的…

android jni 结构体_Android应用开发Android JNI-c/c++调用java方法

本文将带你了解Android应用开发Android JNI-c/c调用java方法&#xff0c;希望本文对大家学Android有所帮助。"Android JNI-c/c调用java方法&#xff0c;在使用ndk开发的时候&#xff0c;java调用c/c方法是必须要的。但是很多时候&#xff0c;c/c有callback需要反馈给jav…

word如何设置页眉横线的磅数

首先双击页眉&#xff0c;并选定横线 这样即为选中了横线 之后点击&#xff1a; 选择“边框与底纹” 之后按照下图设置即可

聚焦基础科学 引领未来发展

作者&#xff1a;姜桂兴 来源&#xff1a;光明日报当前&#xff0c;伴随着新一轮科技革命和产业变革的兴起&#xff0c;各国科技创新正在回到基础科学研究的根本问题上来。科学界意识到&#xff0c;技术创新背后的推动力是深层次的科学问题研究&#xff0c;只有聚焦基础问题研究…

python如何创建一个列表_在python中创建列表的最佳和/或最快方法

在python中&#xff0c;据我所知&#xff0c;至少有3到4种方法来创建和初始化给定大小的列表&#xff1a; 简单循环append&#xff1a; my_list []fori inrange(50):my_list.append(0) 简单循环&#xff1a; my_list []fori inrange(50):my_list [0] 列表理解&#xff1a; my_l…

maven 公共模块依赖_Maven 子模块 依赖 springboot 子模块的问题

package com.datayes.quantgraph.security does not exist子模块A 依赖 子模块 B&#xff0c;子模块B 是一个 springboot 项目。我们知道springboot 项目在打包的时候&#xff0c;使用的是org.springframework.bootspring-boot-maven-pluginspringboot 打包的时候 会有两种一个…

word页眉的横线怎么居中

有时候word插入的页眉的横线居然不是居中&#xff0c;是偏左的&#xff08;好无语。。&#xff09; 为了解决这个问题&#xff0c;首先双击页眉&#xff0c;选中当前页眉的所有内容 点击插入对齐制表符 此时横线处于居中状态了 但这时文字不居中了。。此时只需要将文字设成左…

pt-stalk

pt-stalk 1. 概述 在MySQL服务器出现短暂(5~30秒)的性能波动的时候&#xff0c;一般的性能监控工具都很难抓住故障现场&#xff0c;也就很难收集对应较细粒度的诊断信息。另外&#xff0c;如果这种波动出现的频率很低&#xff0c;例如几天才一次&#xff0c;我们也很难人为的抓…

阿里平头哥会和AMD一样成为令英特尔头痛的存在吗?

来源&#xff1a;与非网阿里巴巴通常被认为是中国最大的电子商务和云平台运营商。但是去年9月&#xff0c;这家科技巨头与一家名为平头哥的新子公司正式进入了芯片制造市场。此举是在阿里巴巴收购中国芯片制造商杭州中天微之后的几个月。平头哥将中天微与阿里巴巴自己的研发部门…

python变量类型之间转换_Python常用数据类型之间的转换总结

函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x转换到一个浮点数 complex(real [,imag]) 创建一个复数 str(x) 将对象 x 转换为字符串 repr(x) 将对象 x 转换为表达式字符串 eval(str) 用来计算在字符串中的有效Python表达式,…

extjs中store获取后台数据_Excel实战技巧64: 从工作簿中获取数据(不使用VBA)

学习Excel技术&#xff0c;关注微信公众号&#xff1a;excelperfect这是在研读《Escape From Excel Hell》时学到的技术&#xff0c;从本工作簿中或者其他工作簿中获取所需要的数据&#xff0c;以便于作进一步的分析或者绘制Excel图表。下图1所示是用于获取数据的工作表。图1在…

5G都不能取代的Wi-Fi6,到底有多厉害?

来源&#xff1a;北京物联网智能技术应用协会蜂窝通信与WiFi&#xff0c;就像移动设备上的两大高手。彼此势均力敌&#xff1a;一个主室内&#xff0c;一个主室外。WiFi是移动网络的室内覆盖补充&#xff0c;也承担着大量的数据流量卸载&#xff0c;二者既想各自占山为王&#…