青岛网站建设培训班矿泉水网站模板

pingmian/2025/10/13 22:56:25/文章来源:
青岛网站建设培训班,矿泉水网站模板,wordpress地址表单,温州网络有限公司目录 1.创建.proto文件 1.1文件规范 1.2添加注释 1.3指定proto3语法 1.4package声明符 1.5定义消息(message) 1.6定义消息字段 2.编译contacts.proto文件 3.序列化与反序列化的使用 1.创建.proto文件 1.1文件规范 • 创建.proto文件时#xff0c;⽂件命名应该使用全…目录 1.创建.proto文件 1.1文件规范 1.2添加注释 1.3指定proto3语法 1.4package声明符 1.5定义消息(message) 1.6定义消息字段 2.编译contacts.proto文件 3.序列化与反序列化的使用 1.创建.proto文件 1.1文件规范 • 创建.proto文件时⽂件命名应该使用全小写字母命名多个字⺟之间⽤ _ 连接。例如 lower_snake_case.proto 。 • 书写.proto⽂件代码时应使用2个空格的缩进。 1.2添加注释 向⽂件添加注释可使⽤ // ?或者? /* ... */ ? 1.3指定proto3语法 Protocol Buffers语⾔版本3简称proto3是.proto文件最新的语法版本。proto3简化了Protocol Buffers语言既易于使用又可以在更⼴泛的编程语言中使⽤。它允许你使用JavaCPython等多种语言生成protocol buffer代码。 在.proto文件中要使用 syntax proto3; 来指定⽂件语法为proto3并且必须写在除去注释内容的第⼀行。如果没有指定编译器会使⽤proto2语法。 在通讯录1.0的contacts.proto文件中可以为文件指定proto3语法内容如下 syntax proto3; 1.4package声明符 package是一个可选的声明符能表示.proto文件的命名空间在项目中要有唯一性。它的作用是为了避免我们定义的消息出现冲突。 在通讯录1.0的contacts.proto文件中可以声明其命名空间内容如下: syntax proto3; package contacts; 1.5定义消息(message) 消息(message) : 要定义的结构化对象我们可以给这个结构化对象中定义其对应的属性内容。 这里再提一下为什么要定义消息 在网络传输中我们需 要为传输双方定制协议。定制协议说白了就是定义结构体或者结构化数据, 比如tcp, udp 报文就是结构化的。 再比如将数据持久化存储到数据库时会将一系列元数据统一用对象组织起来再进行存储。 所以ProtoBuf就是以message的方式来支持我们定制协议字段后期帮助我们形成类和方法来使 用。在通讯录1.0中我们就需要为联系人定义一个message。 .proto文件中定义一个消息类型的格式为: message 消息类型名{ } 消息类型命名规范使用驼峰命名法首字母⼤写。 为contacts.proto (通讯录1.0)新增联系人message 内容如下: syntax proto3; package contacts; // 定义联系⼈消息 message PeopleInfo { } 1.6定义消息字段 在message中我们可以定义其属性字段字段定义格式为:字段类型字段名字段唯一编号 ; ●字段名称命名规范:全小写字母多个字母之间用_连接。 ●字段类型分为:标量数据类型和特殊类型(包括枚举、其他消息类型等)。 ●字段唯一编号:用来标识字段一旦开始使用就不能够再改变。 该表格展示了定义于消息体中的标量数据类型以及编译.proto文件之后自动生成的类中与之对应的字段类型。在这里展示了与C语言对应的类型。 [1]变长编码是指:经过protobuf 编码后原本4字节或8字节的数可能会被变为其他字节数。 更新contacts.proto (通讯录1.0),新增姓名、年龄字段: syntax proto3; package contacts;message PeopleInfo {string name 1;int32 age 2; } 在这里还要特别讲解一下字段唯一 编号的范围: 1~ 536,870,911 (2^29-1)其中19000 ~ 19999不可用。 19000 ~ 19999不可用是因为:在Protobuf协议的实现中对这些数进行了预留。如果非要在.proto 文件中使用这些预留标识号例如将name字段的编号设置为19000编译时就会报警: // 消息中定义了如下编号代码会告警 // Field numbers 19,000 through 19,999 are reserved for the protobuf implementation string name 19000; 值得一提的是范围为1~ 15的字段编号需要-一个字节进行编码16 ~ 2047内的数字需要两个字节进行编码。编码后的字节不仅只包含了编号还包含了字段类型。所以1 ~ 15要用来标记出现非常频繁的字段,要为将来有可能添加的、频繁出现的字段预留一些出来。 2.编译contacts.proto文件 编译命令 编译命令行格式为 编译contacts.proto文件命令如下 protoc --cpp_out. contacts.proto 编译contacts.proto文件后会生成所选择语言的代码我们选择的是C,所以编译后生成了两个 文件: contacts.pb.hI contacts.pb.cc。 对于编译生成的C代码包含了以下内容: ●对于每个message都会生成一个对应的消息类。 ●在消息类中编译器为每个字段提供了获取和设置方法以及一下其他能够操作字段的方法。 ●编辑器会针对于每个.proto文件生成.h和.cc文件,分别用来存放类的声明与类的实现。 contacts.pb.h部分代码展示 class PeopleInfo final : public ::PROTOBUF_NAMESPACE_ID::Message { public:using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom;void CopyFrom(const PeopleInfo from);using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom;void MergeFrom(const PeopleInfo from){PeopleInfo::MergeImpl(*this, from);}static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName(){return PeopleInfo;}// string name 1;void clear_name();const std::string name() const;template typename ArgT0 const std::string , typename... ArgTvoid set_name(ArgT0 arg0, ArgT... args);std::string *mutable_name();PROTOBUF_NODISCARD std::string *release_name();void set_allocated_name(std::string *name);// int32 age 2;void clear_age();int32_t age() const;void set_age(int32_t value); }; 上述的例子中: ● 每个字段都有设置和获取的方法getter的名称与小写字段完全相同setter方法以set_ 开头。 ● 每个字段都有一个clear_ 方法可以将字段重新设置回empty状态。 contacts.pb.cc中的代码就是对类声明方法的一些实现在这里就不展开了。 到这里有同学可能就有疑惑了那之前提到的序列化和反序列化方法在哪里呢?在消息类的父类 MessageLite中提供了读写消息实例的方法包括序列化方法和反序列化方法。 class MessageLite {public://序列化bool SerializeToOstream(ostream* output) const; // 将序列化后数据写⼊⽂件流bool SerializeToArray(void *data, int size) const;bool SerializeToString(string* output) const;//反序列化bool ParseFromIstream(istream* input); // 从流中读取数据再进⾏反序列化动作bool ParseFromArray(const void* data, int size);bool ParseFromString(const string data); }; 注意: ●序列化的结果为二进制字节序列而非文本格式。 ●以上三种序列化的方法没有本质上的区别只是序列化后输出的格式不同可以供不同的应用场景使用。 ●序列化的API函数均为const成员函数因为序列化不会改变类对象的内容而是将序列化的结果 保存到函数入参指定的地址中。 3.序列化与反序列化的使用 创建一个测试文件main.cc,方法中我们实现: ●对一个联系人的信息使用PB进行序列化并将结果打印出来。 ●对序列化后的内容使用PB进行反序列解析出联系人信息并打印出来。 main.cc #include iostream #include contacts.pb.h using namespace std;int main() {string people_str;{//.proto文件声明的package,通过protoc编译后会为编译生成的C代码声明同名的命名空间//范围是在.proto文件中定义的内容contacts::PeopleInfo people;people.set_age(20);people.set_name(张三);//调用序列化的方法将序列化后的二进制序列存放到string中if(!people.SerializeToString(people_str)) {cout 序列化联系人失败 endl;}//打印序列化的结果cout 序列化的结果 people_str endl;}{contacts::PeopleInfo people;//调用反序列化方法读取string中存放的二进制序列并反序列化出对象if(!people.ParseFromString(people_str)) {cout 反序列化联系人失败 endl;}//打印结果:cout 联系人年龄 people.age() endl; cout 联系人姓名 people.name() endl; }return 0; } 代码书写完成后编译main.cc,生成可执行程序TestProtoBuf : g main.cc contacts.pb.cc -o TestProtoBuf -stdc11 -lprotobuf ●-lprotobuf: 必加不然会有链接错误。 ●-stdc11: 必加使用C11语法。 执行TestProtoBuf,可以看见people经过序列化和反序列化后的结果:  由于ProtoBuf是把联系人对象序列化成了二进制序列这里用string来作为接收二进制序列的容器。 所以在终端打印的时候会有换行等一些乱码显示。 所以相对于xml和JSON来说因为被编码成二进制破解成本增大ProtoBuf 编码是相对安全的。

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

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

相关文章

现在帮别人做网站赚钱不wordpress招商加盟

参考资料:生物统计学 从严格意义上讲,两因素试验都应当设置重复观测值,以便检验交互作用是否真实存在,对试验误差有更准确的估计,从而提高检验效率。但根据专业知识或先前的试验已经证明两个因素不存在交互作用时&…

老鹰网网站建设建博客网站

查看路由规则 [rootlocalhost cc]# ip rule list 0: from all lookup local 32765: from 10.0.19.24 lookup 4096 32766: from all lookup main 32767: from all lookup default 现在有 4 条路由规则,优先级是怎样的,0 代表最低优先级还是最高优先级 在…

网站ftp上传到空间济南网站建设公司川芎网络

在开发的时候,发现图片锯齿严重,打包到移动端或者在编辑器都这样,如下图 原因: 查了一些资料,找到了原因如下:关于为什么会发生这种情况:看起来你的源资源比你在屏幕上显示的大小大得多。所以当…

做公司月刊网站杭州最好的电商培训学校

ThinkPHP框架 访问入口文件后在application文件夹中会出现一些文件夹,其中的home文件夹是前端模块,也可以在application文件夹中新建文件夹。home文件夹模块中Conf文件夹的config配置文件,是对于当前模块的:修改当前模式conventio…

网站改版中 模板专业网站建设管理

TimeGPT:首个时间序列分析基础大模型 1. 论文解读1.1 研究背景1.2 TimeGPT详解1.2.1 时间序列预测问题基础1.2.2 TimeGPT架构1.2.3 训练数据集1.2.4 训练TimeGPT1.2.5 不确定性量化1.2.6 实验结果1.2.6.1 Zero-shot 推断1.2.6.2 Fine Tuning1.2.6.3 时间对比1.2.7 讨论2. Time…

松江做网站公司传媒网站设计公司

一、JavaScript包管理器分类 NPMYarnPNPMBun 二、包管理器的区别 1、NPM 是Node.js的默认包管理器,默认随Node.js一起安装,无需额外配置。 npm2 采用简单的递归依赖方法,最后形成高度嵌套的依赖树。然后就会造成如下问题:重复依…

网站如何进行品牌建设怎么在网站上打广告

目录 一、什么是二叉树? 二、二叉树的主要类型 三、二叉树的实现 四、二叉树的应用 五、关于二叉树的题目 引言: 二叉树是计算机科学中常用的一种数据结构,它是由节点组成的层级结构,每个节点最多有两个子节点。在Java编程语言中,二…

刷leetcode对网站开发有用吗淄博建设工程学校官方网站

三种类型的变量: Java中常量的定义: 下面的这个加号表示连接的意思,也就是把前面的字符串常量和后面的变量值在显示时连在一起: 显示效果如下: 如果没有用这个加号,就会报错:

html做的图片网站网络营销外包项目

1、盒模型 盒模型从外到内一次为:margin-box、border-box、padding-box、content-box。 2、一些属性设置的相对位置 ⑴background-position的属性值(top/right/bottom/left/center)起始位置是相对于padding-box外边沿开始的,…

湖北建设厅行政服务中心网站美术生最吃香的专业

1.Socket的黏包 问题:Socket在发送消息时,并不是按照我们发送多大的数据,它就会完封不动的发送给对方,这中间可能存在丢包、数据包顺序不一致、数据包不完整、重复接收到数据包等问题。 方案: a.定义数据协议&#x…

做网站站长先把作息和身体搞好wordpress seo代码

题目:数据集如下图所示,根据我们对决策树的理解,设计一棵决策树,并输入{Age:36,Salary:H,STU:No,Credit:OK} 测试数据,是否与预期结果一致?注意,不允许直接调用Sklearn提供的决策树方法 决策树算…

wordpress如何搭建论坛厦门seo外包服务

一 redis 的扩展应用 lua redis如何保证原子操作 说明:引入lua脚本,核心解决原子性问题 ① redis为什么引入lua? lua脚本本身体积小,启动速度快 ② redis引入lua的优势 小结: 类似自定义redis命令 ③ redis中如何使用lua ④ EVAL 说明&#…

济南网站制作推广电子商务网页设计总结

1 问题 点击EditText的时候,键盘挡住了,不好输入内容 2 解决办法 在AndroidManifest.xml相应的activity里面添加 android:windowSoftInputMode"adjustPan|stateHidden"

自己做网站的费用wordpress插件手动安装

开窗函数——排序函数 开窗函数与其他函数的区别是,它不是关联其他表查询,而是在一张表内根据我们的想法自定义的规则分组后对我们组内的数据进行检索和计算。我们自定义的规则所分的组,就如同整张表的一个个小窗口,因此我们开出一个个小窗口并对这些小…

天津武清做淘宝网站电脑打不开网页怎么回事

引言 大家好,今天给大家分享一下最新版本OpenCV4.8 QT5 如何一起配置,完成环境搭建的。 下载OpenCV4.8并解压缩 软件版本支持 CMake3.13 或者以上版本 https://cmake.org/ VS2017专业版或者以上版本 QT5.15.2 OpenCV4.8源码包 https://github.com/op…

wordpress 定时机制东莞营销网站建设优化

✨✨ 祝屏幕前的您天天开心,每天都有好运相伴。我们一起加油!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 引言 一、为什么页面加载时间重要? 二、如何减少页面加载时间? …

惠州网站建设怎么样wordpress首次访问很卡慢

modbus-RTU是一种比较简单、可靠的协议 RTU, 是modbus中的一种应用层协议,在OSI的第七层 数据格式 应用

怎么促成客户做网站wordpress 视频管理 主题

ElasticSearch 1、ElasticSearch学习随笔之基础介绍 2、ElasticSearch学习随笔之简单操作 3、ElasticSearch学习随笔之java api 操作 4、ElasticSearch学习随笔之SpringBoot Starter 操作 5、ElasticSearch学习随笔之嵌套操作 6、ElasticSearch学习随笔之分词算法 7、ElasticS…

深圳网站建设微赢天下龙华建站公司

在本文中,我们全面探讨了文本分类技术的发展历程、基本原理、关键技术、深度学习的应用,以及从RNN到Transformer的技术演进。文章详细介绍了各种模型的原理和实战应用,旨在提供对文本分类技术深入理解的全面视角。 关注TechLead,分…