协议缓冲区,让C#与C ++通信:输入问题和架构问题

时间:2012-01-29 16:31:52

标签: c# c++ protocol-buffers protobuf-net

我即将开始一个连接两个程序的项目,一个在c#中,另一个在c ++中。我已经有一个有效的c#程序,可以与其他版本的自己交谈。在开始使用c ++版本之前,我已经考虑过一些问题:

1)我正在使用protobuf-net v1。我认为来自序列化程序的.proto文件正是c ++版本的模板所需要的?谷歌搜索提到了关于pascal外壳的一些内容,但我不知道这是否重要。

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

3)人们可以想到还有其他陷阱吗?二进制格式和类似的东西?

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

2 个答案:

答案 0 :(得分:4)

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

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

  3. 协议缓冲区的目的是使它在线上都是二进制兼容的,所以确实不应该陷入困境...阅读文档以了解版本控制策略等我唯一能想到的是,至少在Java版本中,最好让枚举字段可选,并给枚举类型本身设置为“未知”的零值,如果你试图反序列化一个在反序列化代码中不支持的新值。

答案 1 :(得分:3)

Jon的一些小小的补充:

  • protobuf-net v1确实有一个Getaproto可能有助于起点,但是,为了互操作目的,我建议从.proto开始; protobuf-net也可以工作,无论是通过“protogen”,还是通过VS addin
  • 除此之外,只要您记得将所有文件视为二进制文件,就不应该有我的问题;在文本模式下打开文件会导致悲伤