协议缓冲区,让C#与C++对话:类型问题和模式问题
Protocol buffers, getting C# to talk to C++ : type issues and schema issues
我即将开始一个连接两个程序的项目,一个在c#中,另一个在c++中。我已经有了一个正在运行的c#程序,它可以与其他版本的程序进行对话。在我开始使用c++版本之前,我已经考虑了一些问题:
1) 我使用的是protobuf网络v1。我认为序列化程序中的.proto文件正是c++版本所需的模板?谷歌搜索中提到了一些关于帕斯卡尔大小写的内容,但我不知道这是否重要。
2) 如果其中一个.NET类型在c++中没有直接对应的类型,该怎么办如果我有一个十进制或字典怎么办?我是否必须以某种方式修改.proto文件,并将数据压缩成不同的形状?
3) 人们还能想到其他问题吗?二进制格式之类的东西?
编辑我现在已经看了一个原始文件。似乎.NET特定的东西被标记了,例如bcl。DateTime或bcl。十进制的亚型包括在原型定义中。不过,我不知道该怎么处理bcl类型。如果我的c++程序看到一个小数,它会怎么做?
-
是的,原型文件应该是兼容的。这个外壳是关于约定的,它不应该影响实际的功能——只是生成的代码等。
-
重要的不是.NET中是否有直接可比较的类型,而是协议缓冲区是否支持该类型。协议缓冲区大多非常原始——如果你想建立更大的缓冲区,你需要创建自己的消息。
-
协议缓冲区的目的是使其在网络上完全二进制兼容,所以真的不应该有。。。阅读文档以了解版本控制策略等。我唯一能想到的是,至少在Java版本中,将枚举字段设为可选字段是个好主意,并为枚举类型本身指定一个零值"unknown",如果您试图反序列化代码中尚不支持的新值,则会使用该零值。
对Jon的分数做了一些小的补充:
- protobuf-netv1确实有一个Getaproto,它可能有助于确定起点,但是,出于互操作的目的,我建议从.proto开始;protobuf网络也可以通过"protogen"或VS插件实现这一点
- 除此之外,只要记得将所有文件都视为二进制文件,就不应该有我的问题;以文本模式打开文件会引起悲伤
相关文章:
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 指针问题:从不兼容的类型"int"分配给"int *"
- 特征返回类型的 pybind11 问题
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 使用泛型类型推送到堆栈时出现问题
- 在点云库 (PCL) 中使用自定义点类型的问题
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 为<vtkDataArray> VTK 非结构化网格声明 vtkSmartPointer 类型的变量时出现问题
- 模板<类型名称...参数>的问题
- 类型转换问题
- GLUT 问题:重新声明 c++ 内置类型'wchar_t'时出错
- printf 数据类型说明符复杂问题
- 缺少类型说明符和另一个问题
- 拆分 pybind11 模块和自动类型转换问题
- 类型转换问题:返回为整数而不是浮点/类型
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 我的 SWIG 类型图有什么问题?
- 从标准输入读取多个类型时出现问题