Protobuf —— .proto文件详解

Protobuf —— .proto文件详解关注微信公众号搜索 Qt io 或 Qt 开发者中心 了解更多关于 Qt C 开发知识 笔者 jxd

说明

     proto文件扩展名称为”.proto“,可以使用import包含另一个.proto文件。


字段限制

     required —— 必须赋值的字符
     optional —— 可有可无的字段,可以使用[default = xxx]配置默认值
     repeated —— 可重复变长字段,类似数组






类型

在这里插入图片描述

  • 系统默认值:

     string默认为空字符串;

     bool默认为false;

     数值默认为0;

     enum默认为第一个元素

举例
  • 小例
         如下,”proto2″语法类型、VsQtProtobuf包名、Persion为消息名、消息内部定义了4个带有默认值得项 – 1个必填和3个选填、性别枚举、消息Grade和Language。
         注意:嵌套的Grade和Language声明方式不一样。在代码里解析也不一样。首先Grade声明的是optional那么直接按常规使用即可;Language声明方式为repeaed,这样的话解析时必须循环解析。
    process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2F1dG9tb2JsaWUw,size_16,color_FFFFFF,t_70)






// 发送端 void ProtobufTest_A::on_sendButton_A_clicked() { // 单播 // qint64 len = mSocket->writeDatagram(ui->textEdit->toPlainText().toUtf8(),QHostAddress("192.168.137.1"),6677); //组播ip地址范围:224.0.0.0-239.255.255.255 //qint64 len = mSocket->writeDatagram(ui->textEdit->toPlainText().toUtf8(),QHostAddress("224.0.0.100"),6677); //广播 //qint64 len = mSocket->writeDatagram(ui->textEdit->toPlainText().toUtf8(), QHostAddress::Broadcast, 6677); // 序列化前初始值 VsQtProtobuf::Persion protobufTest; protobufTest.set_id(ui.port_A->text().toInt()); VsQtProtobuf::Persion::Language *language = protobufTest.add_language(); // 获取长度 unsigned short protobufTestLength = protobufTest.ByteSize() + 1; // 存储序列化buf char *buf = nullptr; buf = new char[protobufTestLength]; memset(buf, 0, protobufTestLength); // 序列化 protobufTest.SerializeToArray(buf, protobufTestLength); // udp发送 UdpSocket_A->writeDatagram(buf, protobufTestLength, QHostAddress(ip_B), port_B); // 释放序列化buf if (buf) delete buf; buf = nullptr; } // 接收端 void ProtobufTest_B::readyRead() { QByteArray array; array.resize(UdpSocket_B->bytesAvailable()); if (array.size()) { UdpSocket_B->readDatagram(array.data(), array.size()); VsQtProtobuf::Persion protobufTest; protobufTest.ParseFromArray(array.data(), array.size()); ui.receiveTxt_B->append("id:\t" + QString::number(protobufTest.id())); ui.receiveTxt_B->append("name:\t" + QString(protobufTest.name().c_str())); ui.receiveTxt_B->append("age:\t" + QString::number(protobufTest.age())); if (::VsQtProtobuf::Persion_Sex::Persion_Sex_man == protobufTest.sex()) ui.receiveTxt_B->append("sex:\t"+QString::fromLocal8Bit("男")); else if (::VsQtProtobuf::Persion_Sex::Persion_Sex_woman == protobufTest.sex()) ui.receiveTxt_B->append("sex:\t" + QString::fromLocal8Bit("女")); else if (::VsQtProtobuf::Persion_Sex::Persion_Sex_taiguo == protobufTest.sex()) ui.receiveTxt_B->append("sex:\t" + QString::fromLocal8Bit("男女")); ui.receiveTxt_B->append("address:\t" + QString(protobufTest.address().c_str())); VsQtProtobuf::Persion::Grade grade =protobufTest.grade(); ui.receiveTxt_B->append("grade-chinese:\t" + QString::number(grade.chinese())); ui.receiveTxt_B->append("grade-english:\t" + QString::number(grade.english())); // 声明方式"repeaed"的解析过程 int indexs = protobufTest.language_size(); for (unsigned int index = 0; index < indexs; ++index) { bool language_chinese = protobufTest.language(index)._chinese(); if (language_chinese) ui.receiveTxt_B->append("language-chinese:\tyes"); else ui.receiveTxt_B->append("language-chinese:\tno"); bool language_english = protobufTest.language(index)._english(); if (language_english) ui.receiveTxt_B->append("language-english:\tyes"); else ui.receiveTxt_B->append("language-english:\tno"); ui.receiveTxt_B->append("\n"); } } } 
  • 结果
    在这里插入图片描述

关注

笔者 – jxd

微信公众号搜索 “码农总动员” 或 微信扫描下方二维码,了解更多你不知道的XX,O(∩_∩)O

在这里插入图片描述

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

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

(0)
上一篇 2026年3月17日 下午6:37
下一篇 2026年3月17日 下午6:37


相关推荐

  • pip离线安装第三方库(尤其第三方库有其它依赖的时候)

    pip离线安装第三方库(尤其第三方库有其它依赖的时候)pip 离线安装第三方库可以分为三步一 找到第三方库及相关依赖库的 wheel 文件并下载下来下载第三方库文件命令 pipinstall 第三方库名 download tmp offline packages 下载第三方库相关依赖文件命令 pipinstalldo tmp offline packages rrequirement txt 二 将第三方库及相关依赖包拷贝到离线服务器上面三 离线安装命令如下 pipinstallno indexfind

    2026年3月26日
    2
  • sensor DVP接口介绍

    sensor DVP接口介绍转载:https://blog.csdn.net/hua371242480/article/details/88629023原创sensor接口之DVP…

    2022年4月29日
    75
  • app store connect

    app store connect1、用开发者账号登录,新建App,其中套装ID和SKU使用的应用的BundleID。2、添加要求的尺寸的应用截图或预览,填写宣传文本、描述、关键词、技术支持网址、营销网址3、填写App的信息、App审核信息(包括登录的账号密码,App审核团队有疑问或需要额外信息时会与其联络的联系人信息)…

    2022年10月20日
    4
  • 分布式事务解决方案和原理

    分布式事务解决方案和原理分布式事务解决方案和原理 以及引发的思考一 背景 我们都知道 在以前的 allinone 的项目开发模式下 所有事务问题都是本地事务问题 基本上利用 mysql 的优化方案和 java 提供的 API 可以解决绝大多数本地事务问题 而在现在的分布式及微服务的模式下 很多事务问题就不是简单的本地事务问题了 正是由于在为服务环境下存在的网络延迟问题 机器不可用问题 以及一次操作由多个系统协同完成而产生的各类问题 导致了逻辑上的一次事务违反了 ACID 中的特性问题 之前的文章介绍了事务中的 ACID 和事务的

    2026年3月18日
    2
  • mac idea 快捷键设置

    mac idea 快捷键设置macidea快捷键设置IntelliJIDEA(简称IDEA)是一款非常优秀的开发工具,有“最好的Java开发工具”之名。IntelliJIDEA–>Preferences–>keymap在右侧面板中的Keymaps下拉选项中选择Eclipse(MacOSX10.5+)apply–>ok——–mac常用快捷键说明——–Mac键盘符号和修饰键说明⌘Command⇧Sh

    2022年6月17日
    101
  • CentOS7 中使用 firewall-cmd 配置只允许指定ip访问本机的指定端口

    CentOS7 中使用 firewall-cmd 配置只允许指定ip访问本机的指定端口

    2021年5月31日
    347

发表回复

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

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