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

Protocol buffers, getting C# to talk to C++ : type issues and schema issues

本文关键字:问题 类型 模式 对话 C++ 缓冲区 协议      更新时间:2023-10-16

我即将开始一个连接两个程序的项目,一个在c#中,另一个在c++中。我已经有了一个正在运行的c#程序,它可以与其他版本的程序进行对话。在我开始使用c++版本之前,我已经考虑了一些问题:

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

2) 如果其中一个.NET类型在c++中没有直接对应的类型,该怎么办如果我有一个十进制或字典怎么办?我是否必须以某种方式修改.proto文件,并将数据压缩成不同的形状?

3) 人们还能想到其他问题吗?二进制格式之类的东西?

编辑我现在已经看了一个原始文件。似乎.NET特定的东西被标记了,例如bcl。DateTime或bcl。十进制的亚型包括在原型定义中。不过,我不知道该怎么处理bcl类型。如果我的c++程序看到一个小数,它会怎么做?

  1. 是的,原型文件应该是兼容的。这个外壳是关于约定的,它不应该影响实际的功能——只是生成的代码等。

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

  3. 协议缓冲区的目的是使其在网络上完全二进制兼容,所以真的不应该有。。。阅读文档以了解版本控制策略等。我唯一能想到的是,至少在Java版本中,将枚举字段设为可选字段是个好主意,并为枚举类型本身指定一个零值"unknown",如果您试图反序列化代码中尚不支持的新值,则会使用该零值。

对Jon的分数做了一些小的补充:

  • protobuf-netv1确实有一个Getaproto,它可能有助于确定起点,但是,出于互操作的目的,我建议从.proto开始;protobuf网络也可以通过"protogen"或VS插件实现这一点
  • 除此之外,只要记得将所有文件都视为二进制文件,就不应该有我的问题;以文本模式打开文件会引起悲伤