【Protobuf】pb中类型字段不匹配问题

2023-11-04

背景

客户端更新proto,新增message字段,探索新增字段的数据类型和标签对服务端反序列化数据的影响

结论

  • 新增字段数据类型与服务端相同标签数据类型:
    • 不同:无法获取数据,但是不报错
    • 相同:能够获取到数据,但数据不是真正要获取的

pb中序列化和反序列化数据时,对message字段只关注它的数据类型和标签,不关注定义的名称

原始数据

demo2_1.proto

syntax = "proto2";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
}

demo2_2.proto

syntax = "proto2";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
}

write.cc

#include <iostream>
#include <fstream>
#include "demo2_1.pb.h"

int main(int argc, const char* argv[])
{
    // 创建AddressBook Person 对象
    Person person;

    // 设置person对象属性值
    person.set_name("zhangsan");
    person.set_id(1001);
    person.set_email("zhangsan@qq.com");

    // 序列化为二进制流并写入文件中
    std::fstream output("msg", std::ios::out | std::ios::trunc | std::ios::binary);
    if (!person.SerializeToOstream(&output)) {
      std::cerr << "Failed to serialize." << std::endl;
      return -1;
    }

    return 0;
}

read.cc

#include <iostream>
#include <fstream>
#include "demo2_2.pb.h"

int main(int argc, const char* argv[])
{
    // 创建AddressBook Person 对象
    Person person;

    // Read the existing address book.
    std::fstream input("msg", std::ios::in | std::ios::binary);
    if (!person.ParseFromIstream(&input)) {
      std::cerr << "Failed to parse." << std::endl;
      return -1;
    }

    std::cout << "*****************************" << std::endl;
    std::cout << "id:    " << person.id() << std::endl;
    std::cout << "name:  " << person.name() << std::endl;
    std::cout << "email: " << person.email() << std::endl;
    std::cout << "*****************************" << std::endl;

    return 0;
}

编译(pb2.5.0) 结果:

*****************************
id:    1001
name:  zhangsan
email: zhangsan@qq.com
*****************************

测试1

修改demo2_1.proto如下:

syntax = "proto2";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional int32 mobile = 3;
  optional string email = 4;
}

demo2_2.proto保持不变,结果如下:

*****************************
id:    1001
name:  zhangsan
email:
*****************************

测试2

修改demo2_1.proto如下:

syntax = "proto2";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string mobile = 3;
  optional string email = 4;
}

demo2_2.proto保持不变,结果如下:

*****************************
id:    1001
name:  zhangsan
email: 10010
*****************************
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Protobuf】pb中类型字段不匹配问题 的相关文章

  • Protobuf在Android中的基本使用

    前言 Protobuf xff0c 类似于json和xml xff0c 是一种序列化结构数据机制 xff0c 可以用于数据通讯等场景 xff0c 相对于xml而言更小 xff0c 相对于json而言解析更快 xff0c 支持多语言 一 Pr
  • 使用protobuf进行序列化时遇到的几个问题

    问题1 向一个string bytes字段设置参数时 xff0c 调用set str xff0c 在SetNoArena 处出现问题 xff0c 程序卡死 原因分析及解决 第一 xff0c 可能是 proto文件中字符串的类型不正确 可以尝
  • 【gRPC】Protobuf中间文件介绍、使用、Go新版本TLS证书认证问题

    文章目录 前言一 gRPCSANCA根证书生成服务端证书签发 二 总结三 参考 前言 初学gRPC xff0c 跟着B站go语言grpc框架实战Up主进行学习 xff0c 其中视频中的坑还是比较多的 xff0c 比如版本方法废弃 xff0c
  • 编译protobuf v3.20.0

    https github com protocolbuffers protobuf git clone git 64 github com protocolbuffers protobuf git cd protobuf git check
  • protobuf的序列化和反序列化的分析

    一 protobuf的optional 数据类型序列化分析 1 optional 的protobuf的文件 格式 syntax proto2 message test proto optional int32 proto1 1 option
  • 【Protobuf(四)】消息格式

    protobuf是一种平台语言无关的消息序列化协议 相比于传统的json xml 序列后的空间更小 但是无法自解释 需要结合额外的proto定义文件才能反序列化 当然这样也更安全 下面记录一下protobuf消息格式 protobuf消息序
  • Protobuf如何集成到C++环境中(VS2019)

    文章目录 前言 下载安装Protocol Compiler和Protobuf Runtime 下载 编译安装Protobuf Runtime 使用Protocol Compiler生成 cc和 h文件 VS工程的配置 测试 前言 Proto
  • 【Protobuf速成指南】enum类型的使用

    文章目录 2 1枚举类型 一 如何定义枚举类型 二 语法规范 三 重定义问题 四 enum类型相关函数 五 Contact 2 1 改写 六 总结 2 1枚举类型 本系列文章将通过对通讯录项目的不断完善 带大家由浅入深的学习Protobuf
  • 【go】Unmarshal时候报错提示proto.Unmarshal: missing method ProtoReflect

    问题 使用proto Unmarshal报错 提示以下信息 cannot use promoRule variable of type db PromotionRuleSet as protoreflect ProtoMessage val
  • protobuf反射详解及应用(pb/json相互转换)

    关于protobuf的使用 编码原理 编码原理应用 可以分别参见以下文章 Python 操作 protobuf 常见用法 linux环境下protobuf的安装与使用 Protobuf编码规则详解 protobuf编码原理及其在schema
  • Win10 下 ProtoBuf 安装编译以及在 C++ 中的用法

    ProtoBuf Protocol Buffer protoBuf 或 PB 是 google 的一种数据交换的格式 它独立于语言 独立于平台 google 提供了多种语言的实现 java c c go 和 python 每一种实现都包含了
  • protobuf c++编程笔记

    文章目录 字段内容的定义 修饰符 字段类型 引用方式 不同字段的方法 1 optional修饰的基本类型 2 optional修饰的对象类型 3 repeated修饰的基本类型 4 repeated修饰的对象类型 序列化 反序列化 字段内容
  • gRPC的介绍、安装与使用

    1 gRPC是什么 在 gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法 使得您能够更容易地创建分布式应用和服务 与许多 RPC系统类似 gRPC也是基于以下理念 定义一个服务 指定其能够被远程调用的方法
  • ProtoBuf(Google Protocol Buffers)—— C++开发具体教程

    ProtoBuf C 开发 教程 C 开发 教程 1 定义你的 protocol 格式 1 1 protocol 字段格式 1 2 指定字段规则 1 3 proto文件 2 编译你的 Protocol Buffers 3 The Proto
  • protobuf的介绍、安装与使用

    1 protobuf是什么 protobuf是google旗下的一款平台无关 语言无关 可扩展的序列化结构数据格式 所以很适合用做数据存储和作为不同应用 不同语言之间相互通信的数据交换格式 只要实现相同的协议格式即同一 proto文件被编译
  • C++Protobuf的生成与使用

    编写 proto文件 syntax 表明protobuf的版本号 末尾不要忘了 package 表明生成的类对象位于哪一个命名空间 末尾不要忘了 每一个类属性后面的必须跟一个编号 且不能重复 syntax proto3 package Pr
  • Protobuf之proto文件编写规则

    一 简单介绍 protobuf文件 就是定义你要的消息 类似java中的类 和消息中的各个字段及其数据类型 类似java类中的成员变量和他的数据类型 二 Protobuf消息定义 1 消息由至少一个字段组合而成 类似于C语言中的结构 每个字
  • Hello! protobuf——编译与安装(c++版)

    目录 前言 一 protobuf是什么 二 protobuf官方路径 三 protobuf编译安装 1 安装前建议 2 cmake使用 1 cmake介绍 2 命令行介绍 3 编译选项介绍 4 cmake安装 3 windows下使用nma
  • C++使用protobuf实现序列化与反序列化

    一 protobuf简介 1 1 protobuf的定义 protobuf是用来干嘛的 protobuf是一种用于 对结构数据进行序列化的工具 从而实现 数据存储和交换 主要用于网络通信中 收发两端进行消息交互 所谓的 结构数据 是指类似于
  • Protobuf安装步骤

    今天看Brpc开源代码的时候 看到了里面提到了google开源的protobuf的数据序列化和反序列工具 所以特地下了源码 试着看下一个简单的使用过程 1 protobuf的介绍 google protobuf是一个灵活的 高效的用于序列化

随机推荐

  • 原子指标,派生指标,衍生指标概念

    指标体系相关概念 1 原子指标 原子指标指的是基于业务过程的度量值 顾名思义是不可以在进行拆分的指标 核心功能 对指标的聚合逻辑进行了定义 三要素 业务过程 度量值 聚合逻辑 2 派生指标 派生指标是基于原子指标的 关系为 派生指标 原子指
  • Docker 常见镜像问题

    Docker 常见镜像问题 Docker 轻松学习 文章目录 Docker 常见镜像问题 一 Docker 是什么 二 如何批量清理临时镜像文件 三 如何查看镜像支持的环境变量 四 docker pull失败 报错提示Error image
  • Elasticsearch—生产环境集群核心配置

    https segmentfault com a 1190000019900040 utm source tag newest
  • C++模板类内友元(友元类,友元函数)声明的三种情况

    根据 C Primer 第三版16 4节的叙述 C 类模板友元分为以下几种情况 1 非模板友元类或友元函数 书上给了一个例子 class Foo void bar template
  • 分页(Paging) / SQL Server / Oracle

    分页 Paging SQL Server Oracle 虽然 DataGrid 控件自己带了一个分页处理机制 但它是将符合查询条件的所有记录读入内存 然后进行分页显示的 随着符合条件的记录数目增多 就会出现运行效率问题 或者至少是资源的利用
  • gprMax中任意不规则形状建模与模拟

    gprMax中任意不规则形状三维建模与模拟 gprMax中给出了不规则几何形状的建模方法 常规的几何建模都是基于gprMax内置的几何命令建模 所建立的模型是规则的 如圆球 正方体 圆柱体 三角体等 不规则形状三维建模需要利用matlab或
  • 没有基础的想转行学习Python怎么学

    无意中听朋友说 Python是一门神奇的语言 他建议我去学习Python 因为 Python 作为一门高级语言 通俗易懂 所以我就锁定了目标 学 Python 由于转行 工作内容和个人规划都对他提出了新的学习要求 如何从繁忙的工作和生活中抽
  • 《大数据基础——基于Hadoop与Spark》课后习题——第一章部分答案

    仅用于我个人的学习 书籍为人民邮电出版社的 大数据技术基础 基于Hadoop与Spark 课后习题选择是我个人认为有用的 记录下来是为了督促我学习 共好 1 请指出以下术语的基本含义 元数据 分布式存储 计算机集群 并行计算 DFS Map
  • C300 之SFU设备配置指导

    认证方式支持 GPON SFU支持SN PW LOID LOID LOID PW四种认证注册方式 EPON SFU支持MAC SN LOID三种认证注册方式 我们一般使用的 OLT EPON板默认是MAC认证方式 如果想用其他方式注册 需要
  • DFS时间复杂度

    DFS算法是一一个递归算法 需要借助一个递归工作栈 故它的空间复杂度为 O N O N O N 遍历图的过程实质上是对每个顶点查找其邻接点的过程 其耗费的时间取决于所采用结构 邻接表表示时 查找所有顶点的邻接点所需时间为
  • html中使用img标签图片无法正常显示

    在学习html css过程中 自己在编辑器里尝试使用img标签来显示图片 是一张鲜花的图片 代码如下 刚开始写的是绝对路径 照片无法正常显示 后来经过问别人 别人建议把 换成 更改后仍然无法正常显示 经检查 图片路径并无错误 这是十分疑惑
  • OCR图像识别技术的JAVA实现(一)

    OCR图像识别技术的JAVA实现 最近有个需求需要用图像识别 学习记录一下 目前网络上的开源的图像识别技术有很多 例如 OCRE OCR Easy Clara OCR OCRAD TESSERACT OCR 等等 今天本blog将记录下te
  • openGauss学习笔记-35 openGauss 高级数据管理-ALTER TABLE语句

    文章目录 openGauss学习笔记 35 openGauss 高级数据管理 ALTER TABLE语句 35 1 语法格式 35 2 参数说明 35 3 示例 openGauss学习笔记 35 openGauss 高级数据管理 ALTER
  • Html网页打开自动弹出显示内容或图片

    直接复制到要弹出的页面就可
  • K站中转内最便宜的航班

    LeetCode 787 K站中转内便宜的航班 有 n 个城市通过 m 个航班连接 每个航班都从城市 u 开始 以价格 w 抵达 v 现在给定所有的城市和航班 以及出发城市 src 和目的地 dst 你的任务是找到从 src 到 dst 最
  • gRPC-Go源码解读一 客户端请求链路分析

    最近在学习gRPC相关的知识 为啥要学呢 因为一直在用 古人云 工欲善其事 必先利其器 为此 花了不少时间阅读gRPC Go的源码 收货甚多 比如透过服务发现和负载均衡这俩组件来学习复杂模块之间低耦合高内聚的设计方法 透过bdp采样与htt
  • 生信分析是个什么玩意儿?

    生信小白 老板最近说 要搞搞高大上的全基因组测序 让我去做测序数据分析 可我都不懂哇 生信猿 这不就是生物信息分析嘛 搭建集群 搭建流程 跑跑数据 生信小白 听说你有一个朋友很厉害 可以让他教教我吗 生信猿 你说的是西克孚肉吧 他可是生信方
  • 打开文档时显示:loading UIxml file is failed.for more information, please use KDebugConsole or read logs.

    今天新建一个文档时候 在我打开图片时候报错了 关闭这个页面后 重新打开文档 报了以下错误 点击OK后 而后看到其他人的方法 先看其他软件能否打开 都打不开 就重装系统 要是只有这个打不开就卸载了重新安装WPS 重装系统是不可能重装的 安装W
  • 初识Java

    Java之父 詹姆斯 高斯林 Write once Run anywhere jdk jre jvm的关系 jdk Java开发工具 jre Java运行环境 jvm Java虚拟机 xxx java程序的运行 首先javac xxx ja
  • 【Protobuf】pb中类型字段不匹配问题

    文章目录 背景 结论 原始数据 测试1 测试2 背景 客户端更新proto 新增message字段 探索新增字段的数据类型和标签对服务端反序列化数据的影响 结论 新增字段数据类型与服务端相同标签数据类型 不同 无法获取数据 但是不报错 相同