proto学习

proto学习介绍 protocolbuff 是一种语言无关 平台无关 可扩展的序列化结构数据的方法 它可用于通信协议 数据存储等 protocolbuff 的接口 c java pythonAPIdoc https developers google com protocol buffers docs reference overview 参考 https www jianshu com p a24c88c0526a 通俗点说 就是将要发送的消息 通过 protobuf 格

介绍

通俗点说,就是将要发送的消息,通过protobuf格式发出去,自动进行封装。另一方对proto格式解析,直接得到原数据。

protocol buffers是什么?

是一种结构数据序列化方法, 可类比XML。 定义数据的结构 > 生成的源代码(.proto文件) -> 在数据流中&各种语言进行编写, 读取结构数据。 

如何使用

  1. 定义.proto文件, 来定义你的数据结构;(消息格式文件)中定义 protocol buffer message 类型, 来指定你想如何对序列化信息进行结构化。 message 包含name-value对, 可嵌套。

缺省默认就设置为 optional

创建 .proto 文件,定义数据结构

message xxx { 
    // 字段规则:required -> 字段只能也必须出现 1// 字段规则:optional -> 字段可出现 0 次或1// 字段规则:repeated -> 字段可出现任意多次(包括 0// 类型:int32、int64、sint32、sint64、string、32-bit .... // 字段编号:0 ~ (除去 1900019999 之间的数字) 字段规则 类型 名称 = 字段编号; } 

注:

1) message 定义中的每个字段都有唯一编号。 2) 单个 .proto 文件中定义多种 message 类型 3) message内可嵌套message 4) .proto 文件添加注释,可以使用 C/C++ 语法风格的注释 ///* ... */ 
  1. 使用protoc编译器进行编译,导出c++代码。
    我们在 .proto 文件中定义了数据结构,这些数据结构是面向开发者和业务程序的,并不面向存储和传输。
    当需要把这些数据进行存储或传输时,就需要将这些结构数据进行序列化、反序列化以及读写。那么如何实现呢?不用担心,ProtoBuf 将会为我们提供相应的接口代码。如何提供?答案就是通过 protoc 这个编译器。




可通过如下命令生成相应的接口代码:

// $SRC_DIR: .proto 所在的源目录 // --cpp_out: 生成 c++ 代码 // $DST_DIR: 生成代码的目标目录 // xxx.proto: 要针对哪个 proto 文件生成接口代码 protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto 
  1. 使用c++的api进行数据的读写()。

person结构体举例:

message Person { 
    required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { 
    MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { 
    required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } 

一个例子
创建.proto文件

message Example1 { 
    optional string stringVal = 1; optional bytes bytesVal = 2; message EmbeddedMessage { 
    int32 int32Val = 1; string stringVal = 2; } optional EmbeddedMessage embeddedExample1 = 3; repeated int32 repeatedInt32Val = 4; repeated string repeatedStringVal = 5; } 

调用生成接口, 进行序列化操作

#include 
    #include 
    #include 
    #include "single_length_delimited_all.pb.h" int main() { 
    Example1 example1; example1.set_stringval("hello,world"); example1.set_bytesval("are you ok?"); Example1_EmbeddedMessage *embeddedExample2 = new Example1_EmbeddedMessage(); embeddedExample2->set_int32val(1); embeddedExample2->set_stringval("embeddedInfo"); example1.set_allocated_embeddedexample1(embeddedExample2); example1.add_repeatedint32val(2); example1.add_repeatedint32val(3); example1.add_repeatedstringval("repeated1"); example1.add_repeatedstringval("repeated2"); std::string filename = "single_length_delimited_all_example1_val_result"; std::fstream output(filename, std::ios::out | std::ios::trunc | std::ios::binary); if (!example1.SerializeToOstream(&output)) { 
    std::cerr << "Failed to write example1." << std::endl; exit(-1); } return 0; } 

.proto 模板
比如新建xxx.proto

syntax = "proto2"; package xxx.person; # 该.proto产生的类会被封装在xxx::person命名空间中 import "yyy.proto"; # 引用其他的.proto message student { 
    } 

常见问题

  1. 出现 [libprotobuf WARNING google/protobuf/compiler/parser.cc:648] No syntax specified for the proto file: example.proto. Please use ‘syntax = “proto2”;’ or ‘syntax = “proto3”;’ to specify a syntax version. (Defaulted to proto2 syntax.)

解决:在开头写入: syntax = “proto2”;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225833.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午8:26
下一篇 2026年3月17日 上午8:26


相关推荐

  • ARM嵌入式开发板学习路线指引

    ARM嵌入式开发板学习路线指引如何入门嵌入式 嵌入式开发学习方法步骤如何入门嵌入式 嵌入式开发学习路线指引嵌入式开发就是指在嵌入式操作系统下进行开发 一般常用的系统有 linux android 平台 Cortex A9 开发板嵌入式技术学习如何入手 从何学起呢 以下内容简单介绍嵌入式开发的学习步骤及如何成为一位合格的嵌入式工程师 一 首先要掌握基础架构嵌入式 Linux 系统从软件角度看可以分为四个部分 引导加载程序 Bootloader Linux 内核 文件系统 应用程序 开发编译环境的搭建

    2026年3月18日
    2
  • spss分析方法-聚类分析

    spss分析方法-聚类分析聚类分析是根据研究对象的特征 按照一定标准对研究对象进行分类的一种分析方法 下面我们主要从下面四个方面来解说 一 实际应用聚类分析的目标就是在相似的基础上收集数据来分类 聚类源于很多领域 包括数学 计算机科学 统计学 生物学和经济学 在不同的应用领域 很多聚类技术都得到了发展 这些技术方法被用作描述数据 衡量不同数据源间的相似性 以及把数据源分类到不同的簇中 商业上 聚类分析被用来发现不同的客户群 并且通过购买模式刻画不同的客户群的特征 聚类分析是细分市场的有效工具 同时也可用于研究消费者行为

    2026年3月19日
    2
  • ISAPI详细分析

    ISAPI详细分析ISAPI 包括扩展和过滤器两种形式 都可以利用来开发动态动态 Web 内容 ISAPI 扩展和过滤器都以 DLL 形式实现 供 IIS 进程调用 扩展按规范必须实现两个函数接口 GetExtension HttpExtensio 和一个可选函数接口 TerminateExt 扩展和 Web 服务器中特定虚拟目录下的文件类型关联 可以和特定的文件后缀 比如 txt 关联 也

    2026年3月17日
    2
  • 一周信创舆情观察(12.7~12.13)

    一周信创舆情观察(12.7~12.13)一、一周舆情要点行业方面,2020年集成电路设计行业销售额预计为3819.4亿元,比2019年的3084.9亿元增长23.8%。日前,我国自主研发的一项物联网安全测试技术(TRAIS-PTEST)由国际标准化组织/国际电工委员会(ISO/IEC)发布成为国际标准。拉勾近日发布人才白皮书,至2020年底我国新基建相关核心技术人才缺口已达426万。国际方面,微软为ARM版本Win10推出64位模拟器。欧盟新法规定,超大型科技公司需监督互联网,否则罚款年营业额6%。近日,思科和英国云通信软件公司IMImo

    2022年5月10日
    49
  • 查看linux执行的命令记录_history命令详解

    查看linux执行的命令记录_history命令详解前言我们每次敲打linux命令的时候,有时候想用之前用过的命令,一般情况下,我们都会按↑↓箭头来寻找历史的命令记录,那如果我想用1天前执行的某条命令,难道还要按↑100次?显示这样是不现实的,我们可

    2022年7月29日
    16
  • 科大讯飞离线语音合成简单实例

    科大讯飞离线语音合成简单实例

    2026年3月14日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号