使用Google协议缓冲区和Protobuf-C将双重属性从C ++转移到C#的问题#

时间:2013-07-11 03:30:39

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

我试图将一个对象作为序列化字符串从C ++发送到C#而不是QPID,这是一个消息传递系统。我目前有一个Google原型文件:

package Serializable;

message Order_ser 
{
    optional  int32 openord = 1 [default = 0];
    optional  int32 oldord = 2 [default = 0]; 
    optional  double price = 3 [default = 0];
}

通过C ++传输对象时,我在C#end收到错误

Protocol message tag had invalid wire type.

仅当我为双重类型(例如price)分配值时才会发生这种情况。

2 个答案:

答案 0 :(得分:1)

尽管有这个名字,但我并不相信SerializeAsString 真的将其转换为文本 - 因此您不应该将其视为C#侧的文本。我强烈怀疑它将二进制数据解释为UTF-8编码的文本,这是错误的。

我对QPID一无所知,但假设您可以通过这种方式传输任意二进制消息,那就是您应该做的事情。如果您无法通过QPID传输任意二进制消息,那么协议缓冲区可能不适合您 - 它们实际上被设计为有效的二进制表示。你当然可以对数据进行64位编码,但你可能会发现有更合适的方法。

答案 1 :(得分:0)

正如Jon Skeet所说,我认为SerializeAsString将以其文本表示形式返回协议缓冲区(参见https://developers.google.com/protocol-buffers/docs/overview),即

# Textual representation of a protocol buffer.
# This is *not* the binary format used on the wire.
person {
  name: "John Doe"
  email: "jdoe@example.com"
}

对字符串的简单写入将确定这是否正确。这种格式与二进制格式无关,因此您尝试将 反序列化。

选项(最好的顺序)是 *串行到字节数组并以字节形式发送/检索 *串行到字节数组并将字节数组编码/解码为Base64 *像你一样编码为String,并使用String-Deserialise。

我不使用C或C#所以不能建议使用

代码