协议缓冲区,让 C# 与 C++ 对话:类型问题和架构问题

Posted

技术标签:

【中文标题】协议缓冲区,让 C# 与 C++ 对话:类型问题和架构问题【英文标题】:Protocol buffers, getting C# to talk to C++ : type issues and schema issues 【发布时间】:2012-01-29 16:31:51 【问题描述】:

我即将着手一个项目来连接两个程序,一个在 c# 中,一个在 c++ 中。我已经有一个可以工作的 c# 程序,它能够与自身的其他版本通信。在开始使用c++版本之前,我已经想到了一些问题:

1) 我使用的是 protobuf-net v1。我认为来自序列化程序的 .proto 文件正是 c++ 版本所需的模板?谷歌搜索提到了一些关于帕斯卡大小写的东西,但我不知道这是否重要。

2) 如果其中一种 .NET 类型在 c++ 中没有直接对应物,我该怎么办? 如果我有小数或字典怎么办?我是否必须以某种方式修改 .proto 文件并将数据压缩成不同的形状? (我会检查文件,看看我能不能弄明白)

3) 人们还能想到其他的陷阱吗?二进制格式之类的?

编辑 我现在已经查看了其中一个原型文件。似乎 .NET 特定的东西被标记了,例如 bcl.DateTime 或 bcl.Decimal。子类型包含在原型定义中。不过,我不确定如何处理 bcl 类型。如果我的 c++ prog 看到小数点,它会做什么?

【问题讨论】:

【参考方案1】:

    是的,proto 文件应该是兼容的。大小写是关于约定的,它不应该影响实际功能 - 只是生成的代码等。

    重要的不是 .NET 中是否存在可直接比较的类型 - 重要的是协议缓冲区是否支持该类型。协议缓冲区大多非常原始 - 如果你想构建更大的东西,你需要创建自己的消息。

    协议缓冲区的意义在于使其在网络上全部二进制兼容,所以真的不应该有问题...阅读文档以了解版本控制策略等. 我唯一能想到的是,至少在 Java 版本中,让枚举字段可选,并给枚举类型本身一个“未知”的零值是一个好主意,如果你尝试反序列化一个反序列化代码尚不支持的新值。

【讨论】:

【参考方案2】:

对 Jon 观点的一些小补充:

protobuf-net v1 确实有一个 Getaproto,它可能有助于一个起点,但是,出于互操作目的,我建议从 .proto 开始; protobuf-net 也可以通过“protogen”或 VS 插件来解决这个问题 除此之外,只要您记得将所有文件都视为二进制文件,您就不应该遇到我的问题;以文本模式打开文件会导致悲伤

【讨论】:

我不知道有什么区别?我使用 Serializer.GetProto 来获取一个字符串,它完全可读并且看起来像一个 .proto 文件。

以上是关于协议缓冲区,让 C# 与 C++ 对话:类型问题和架构问题的主要内容,如果未能解决你的问题,请参考以下文章

google 的从 c# 到 java 的协议缓冲区 - 协议消息标签的线路类型无效

C++ 中的 Google 协议缓冲区:从现有结构创建消息

为啥协议缓冲区 C++ 库不能正确读取二进制对象

使用 Google 协议生成 C# 文件失败

请建议在 C# 和 C++ 之间传递数据的基础设施

反序列化协议缓冲区c ++中的字符串数组