我试图将一个对象作为序列化字符串从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)分配值时才会发生这种情况。
答案 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#所以不能建议使用
代码