1

我正在尝试通过作为消息传递系统的 QPID 将对象作为序列化字符串从 C++ 发送到 C#。我目前有一个谷歌原型文件:

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# 结束时收到错误

Protocol message tag had invalid wire type.

仅当我将值分配给诸如价格之类的双精度类型时,才会发生这种情况。

4

2 回答 2

1

尽管有这个名字,我不相信它SerializeAsString 真的能把它转换成文本——所以你不应该把它当作 C# 端的文本。我强烈怀疑将二进制数据解释为 UTF-8 编码的文本会出错。

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

于 2013-07-11T03:34:59.970 回答
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 * 像你正在做的那样编码为字符串并使用字符串反序列化。

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

于 2013-07-11T05:00:27.163 回答