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

温故知新,机器人进化论之优雅处理层级嵌套的Protobuf文件(.proto)输出为C#代码

什么是Protobuf

image

简单来说,Protobuf是代码世界的“通用翻译官”

跨语言:它让C++ 的结构体能被C#读懂,就像JSON 一样,但比JSON更强大。

高性能:它传输的是二进制(0101...),比文本格式的JSON体积小得多,解析速度快10倍以上。

强契约:通过.proto文件定义数据结构,一旦定义好,类型就是安全的。

场景重现

假设我们的 C++ 工程目录结构如下,不仅有子文件夹,还有跨文件夹的引用(Import):

MyProject/
├── proto/                  <-- 【关键】这是 Proto 的根目录
│   ├── common/             <-- 公共基础库
│   │   └── geometry.proto  <-- 定义了 Point3D 等基础类型
│   └── robot/              <-- 具体的业务模块
│       └── status.proto    <-- 这里引用了 common/geometry.proto
└── MyCSharpApp/            <-- 我们的 C# 项目└── MyCSharpApp.csproj

基础文件:common/geometry.proto

syntax = "proto3";
package common;
option csharp_namespace = "SmartLogistics.Common";message Point3D {double x = 1;double y = 2;double z = 3;
}

业务文件:robot/status.proto

它引用了common目录下的文件

syntax = "proto3";
package robot;
option csharp_namespace = "SmartLogistics.Robot";// 注意这里的路径:它是基于 proto/ 根目录写的
import "common/geometry.proto"; 
import "google/protobuf/timestamp.proto";message VehicleStatus {string device_id = 1;// 直接使用了引用的类型common.Point3D current_location = 2; google.protobuf.Timestamp last_updated = 3;
}

解决方案

1、创建一个.Net的项目,把这些文件包括在其中

image

image

2、将proto目录整体放入项目中来

image

3、给当前项目安装Nuget依赖

  • Google.Protobuf
  • Grpc.Tools (编译工具)
  • Grpc.Net.Client (可选,如果涉及 gRPC 通讯)

image

image

4、双击当前项目进入项目文件编辑

image

添加一个ItemGroup节点

<ItemGroup><Protobuf Include="proto\**\*.proto"ProtoRoot="proto"GrpcServices="Client" />
</ItemGroup>

image

5、直接重新生成即可

image

这时候这些proto对应的.cs文件就在/obj目录下,如果你顺利看到你要的cs文件,说明前面的配置对了,如果没看到说明前面的配置有问题,尤其是注意刚才那个ItemGroup节点对应的路径哈。

image

6、使用

using System;
using Google.Protobuf.WellKnownTypes; // 用于 Timestamp
using SmartLogistics.Common;          // 自动生成的命名空间
using SmartLogistics.Robot;namespace MyCSharpApp
{internal class Program{static void Main(string[] args){// 创建一个复杂的嵌套对象var status = new VehicleStatus{DeviceId = "AGV-2026-X1",// 直接使用引用的 Point3D 类型CurrentLocation = new Point3D { X = 10.5, Y = 20.1, Z = 0 },// 使用 Google 标准时间戳LastUpdated = Timestamp.FromDateTime(DateTime.UtcNow)};Console.WriteLine($"设备 {status.DeviceId} 位置: ({status.CurrentLocation.X}, {status.CurrentLocation.Y})");// 序列化为二进制(模拟发送给 C++ 端)byte[] bytes = status.ToByteArray();Console.WriteLine($"序列化后大小: {bytes.Length} 字节");}}
}

image

http://www.jsqmd.com/news/268523/

相关文章:

  • 2026年煤矿用链条厂家权威推荐榜单:高强度起重链条/刮板机输送机/提升机料斗/标准链轮/链轮链条源头厂家精选
  • 当我们的系统遇到mfc100u.dll文件丢失找不到问题 免费下载方法分享
  • 基于MATLAB的红外与可见光图像融合代码实现(多种方法)
  • 如何联系国内AI智能炒菜机器人?教你轻松搞定 - 真知灼见33
  • 巴音郭楞蒙古自治州英语雅思辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 老周说教育
  • 成都雅思培训机构深度测评推荐:雅思提分课程全阶段适配机构口碑排名 2026 - 老周说教育
  • 2026新年送礼选NMN必看!科学抗衰NMN礼品榜,从原料到吸收NMN哪个牌子好 - 资讯焦点
  • 小型工作室/微小企业真的需要部署NAS吗?其实可以这样做
  • 喀什地区英语雅思辅导机构推荐,2026权威出国雅思课程口碑排行榜 - 老周说教育
  • 当我们系统出现mfc110.dll找不到丢失文件问题 免费下载方法分享
  • 2025年全国最好的花灯品牌推荐,营销花灯/拱门花灯/国风花灯/夜景布置灯/春节花灯/商场美陈花灯,花灯订做厂家哪家权威 - 品牌推荐师
  • 【单片机毕业设计】【dz-1153】基于单片机的泳池环境监测系统
  • iOS App 抓不到包时的常见成因与判断思路,结合iOS 调试经验
  • 2026年有实力的立库滑触线,堆垛机滑触线,电镀线滑触线厂家采购参考指南 - 品牌鉴赏师
  • 【单片机毕业设计】【dz-1154】基于STM32单片机的智能水杯垫
  • 2026年星空型露营帐篷厂家权威推荐榜单:竹节灯笼帐篷/钟型帐篷/椭球帐篷/船屋帐篷/房式帐篷源头厂家精选
  • 2026年山东优质整售山庄推荐榜 - 资讯焦点
  • 【单片机毕业设计】【dz-1143】基于STM32的智慧牛舍养殖系统设计与实现
  • CST仿真实例: 电-光调制器---PNP半导体负载,调制效率
  • 阿克苏地区英语雅思辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 老周说教育
  • 【单片机毕业设计】【dz-1144】基于单片机的社区自愿互助养老系统设计
  • 【单片机毕业设计】【dz-1149】基于单片机半导体加热取暖应用设计
  • 【单片机毕业设计】【dz-1150】基于STM32的智能晾衣架设计
  • YOLOv8部署指南:工业机器人视觉引导系统
  • 微信立减金怎么转成现金?这几种热门方法可盘活 - 京回收小程序
  • LangChain 第四课:拒绝“纸上谈兵”,给大模型装上“双手”
  • rocketMq源码简介
  • 克拉玛依英语雅思辅导机构推荐,2026权威出国雅思课程口碑排行榜 - 老周说教育
  • 德事TEC大中华区布局全景:从北京国贸到上海陆家嘴,240+据点如何满足企业全球化需求 - 资讯焦点
  • 2026适老化拐杖优质厂家推荐榜聚焦安全性能 - 资讯焦点