【问题标题】:Using protocol buffers to interface c# and c++使用协议缓冲区连接 c# 和 c++
【发布时间】:2012-07-23 13:25:25
【问题描述】:

我有一个用 c# 编写的大型解决方案,它使用 protobuf-net 库进行通信。我正在寻找编写一个 c++ 程序来与现有代码对话,并且我即将了解如何做到这一点。

计划如下:

1) 由于一切都是在 c# 中启动的,因此没有 .proto 文件。但是,我可以轻松编写一些从现有消息类 (GetProto) 中捕获 .proto 的代码。

2) 一些类型是非标准的,即它们是根据其他类型定义的:例如,bcl.DateTime 和 bcl.Decimal。使用此链接,我能够找到定义:Protobuf-net - serializing .NET GUID - how to read this in C++?

3) 一旦有了 proto 定义,我就可以运行 Google 代码来生成我的类,这需要一些额外的代码来处理非标准的东西。没什么大不了的。

我目前唯一的问题是字典/地图的格式。它们看起来像这样:

repeated Pair_Decimal_Int32 MyDict = 1

我需要知道的是这种特殊类型是如何定义的。它当然与泛型相关联(取决于字典),所以也许有特殊的代码可以生成它?我不太清楚它在 protobuf-net 中的哪个位置处理这个问题,所以我正在寻求帮助。

【问题讨论】:

  • 我猜Pair_Decimal_Int32 只是一个包含两个字段(doubleint32?)的简单消息,我猜它们被命名为“第一”和“第二” ”。协议缓冲区中没有通用的东西,在将消息处理到字典中时必须处理它。
  • 好吧,我想 Decimal 是 bcl.Decimal 而 Int32 是映射到的任何内容。说得通。为什么显而易见的事情会这样盯着我?

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


【解决方案1】:

请注意,v2 中的 GetProto 是新实现的(如:几天前),可能有粗糙的边缘(它被标记为这样)。

对于日期时间,我建议考虑将它们公开为更简单的类型,以实现互操作 - 可能很长(进入时代)。字典只是键(字段 1)/值(字段 2)的重复版本。 Decimal 在原始 protobuf 中也没有很好的表示;如果可能,请使用 long(按固定值缩放)或 double,IMO。

【讨论】:

  • @Franchesca 是的,我上周的一个晚上写了那篇文章。需要更多测试,但通过了初始测试。
  • 好的,把我当作你自己的个人测试员;)我现在正在全职工作,所以如果我发现任何问题会告诉你。
  • @Franchesca 注意我还没有将它部署到 nuget/google-code;你不必从源代码构建。如果您需要,我可以在今天晚些时候整理一个包裹
  • 啊,没关系,我已经从中继中签出了你的源。现在我将像这样使用它进行测试/调试,但是一旦我在生产中使用它(至少需要几周,所以不要着急),将它部署到 nuget 会很棒。谢谢!!!
  • @Carlos 正是我刚才所说的 :) 注意我说的是“protogen”,而不是“protoc”。
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2023-03-29
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多