当前位置: 首页 > news >正文

C#怎么解析Protobuf数据_C#如何使用谷歌序列化协议【指南】

Protobuf反序列化失败主因是未用匹配的生成类解析器,须用MyMessage.Parser.ParseFrom而非泛型Deserialize;含长度前缀需ParseDelimitedFrom;字段判空应查HasXXX而非null;oneof需用Case枚举判断。Protobuf 反序列化失败:找不到类型或抛出 InvalidProtocolBufferException核心原因不是数据损坏,而是反序列化时用的 messageparser<t> 或 parsefrom 方法没匹配到正确的生成类。c# 的 protobuf(google.protobuf)不靠运行时反射自动识别类型,必须显式传入与 .proto 文件编译后完全一致的生成类。确保你用 protoc --csharp_out=. 生成了 C# 类,并且项目引用了 Google.Protobuf NuGet 包(v3.21+ 推荐)反序列化时必须使用对应消息类型的静态解析器,比如 MyMessage.Parser.ParseFrom(data),而不是泛型 Serializer.Deserialize<T> 那套逻辑如果从网络或文件读取的是带 length-delimited 前缀的多条消息(常见于 gRPC 流或 WriteDelimitedTo),不能直接 ParseFrom(byte[]),得用 CodedInputStream 手动跳过前缀错误示例:MyMessage.Parser.ParseFrom(buffer) 报 InvalidProtocolBufferException: Protocol message contained an invalid tag → 很可能是 buffer 开头多了 4 字节长度前缀,或 buffer 实际是嵌套在另一个消息里如何正确加载 .proto 编译后的 C# 类(不是手动写类)Protobuf 在 C# 里不支持“动态加载 .proto 文件并运行时解析”,所有类型必须提前编译。所谓“解析数据”依赖的是编译生成的 partial class 和内置的 Parser 字段。用官方 protoc 工具生成:安装 protoc 后执行 protoc --csharp_out=. user.proto,会生成 User.cs(含 User.Parser)VS 中更稳妥的方式是用 Grpc.Tools + <Protobuf Include="user.proto" />,由 MSBuild 自动触发生成,避免手动生成路径错乱生成类默认是 internal,若需跨程序集访问,加 option csharp_namespace = "MyApp.Protos"; 并在 .proto 顶部声明,同时在生成时用 --csharp_opt=global别试图把 .proto 内容读成字符串再喂给某个 API——C# 的 Google.Protobuf 没提供 runtime schema 解析能力从 Stream 读取时卡死或抛 EndOfStreamExceptionProtobuf 的二进制格式本身不自带长度信息,ParseFrom(Stream) 默认一直读到流结束。但真实场景中,多数传输协议(如 TCP 粘包、HTTP body、Kafka record)都要求明确消息边界。如果发送端用了 message.WriteDelimitedTo(stream),接收端就必须用 MyMessage.Parser.ParseDelimitedFrom(stream),否则会等不到 EOF 而卡住ParseDelimitedFrom 会先读一个 varint 表示长度,再读对应字节数——这个长度是 Protobuf 内部编码的 payload 长度,不含前缀本身不要对同一 Stream 多次调用 ParseDelimitedFrom 却忘了 stream.Position 已变;尤其别在 MemoryStream 上反复用,容易读越界调试技巧:用 BitConverter.ToString(buffer).Replace("-", " ") 打印前 20 字节,看开头是不是小端 varint(例如 0A 表示长度 10,0C 表示 12)字段值为 null 而不是默认值?检查 oneof 和 optional 的 C# 行为C# 生成类中,optional 字段(proto3)和 oneof 成员默认是可空引用类型或 Nullable<T>,但它们的“未设置”状态不等于 null 或 default,而是靠内部 has_XXX 标志位控制。 Mokker AI AI产品图添加背景

http://www.cnnetsun.cn/news/1813274.html

相关文章:

  • NRA系列伺服扭转作动器
  • 浏览器自动化六大技术路线深度对比:从模拟点击到 Chrome 扩展注入资
  • 【AI原生研发终极指南】:2026奇点大会未公开的7大技术拐点与落地路径
  • Windows家庭版秒变专业版?RDP Wrapper配置全攻略(2024最新避坑指南)
  • 研发部门使用SolidWorks和ug,cad,设计共享云桌面应该怎么选?
  • 3天重构传统微服务为AI Agent系统?网易伏羲团队实录:低代码AI工作流平台上线全过程(含架构图与SLA保障清单)
  • 本硕地信转码国企offer,分享GIS开发学习经验和面试攻略
  • INA219高精度电流功率监控芯片原理与嵌入式驱动开发
  • 联想 Yoga 7a 二合一笔记本:优缺点交织下的市场考验
  • Golang testing怎么写单元测试_Golang单元测试教程【经典】
  • AI原生软件交付提速3.8倍?揭秘头部科技公司已落地的5层DevOps-AI协同架构
  • LAMMPS模拟效率翻倍指南:从in文件编写到运行时间估算全解析
  • 如何检查SQL注入漏洞_利用自动化工具进行安全性扫描
  • 优化文本分类中堆叠模型的网格搜索效率:避免训练卡顿的实战指南
  • 【顶级EI复现】基于鲁棒优化与 KKT 条件的微电网经济调度方法研究(Python代码实现)
  • Qwen3-0.6B-FP8实战教程:集成RAG插件扩展知识库,打造专属领域问答系统
  • 在Linux中用docker安装r-base软件包
  • BEAR协议:面向脑机接口的轻量级嵌入式实时通信协议
  • 告别配置烦恼!在Visual Studio 2019中一键搞定Libcurl静态库编译与项目集成
  • 别再只靠软件了!揭秘TMS320F280049内部SR触发器实现峰值电流模式的另类玩法
  • 2025届必备的五大降AI率网站横评
  • SITS品牌出海成功率提升62%的关键决策链,奇点大会未公开的4层合规架构首次拆解
  • .NET 诊断技巧 | 日志框架原理、手写日志框架学习略
  • 一天一个Python库:lxml - 高效解析XML和HTML的利器彝
  • 深入解析C99中函数隐式声明无效警告的根源与解决方案
  • Obsidian Weread插件终极指南:3分钟实现微信读书笔记自动化同步
  • AIGlasses OS Pro 在智慧城市中的应用:交通流量视觉分析实战
  • Fiddler AutoResponder实战:5分钟学会Mock接口数据,前端开发不用再等后端了
  • UE5富文本框实战:用UMG实现游戏内击杀播报(含蓝图配置)
  • Nexus3实战:5分钟搞定Docker镜像加速+私有化部署(PHPStudy环境版)