首页 文章

使用Google协议缓冲区和Protobuf-C从C到C#传输双重属性的问题#

提问于
浏览
1

我试图通过QPID(一个消息传递系统)将对象作为序列化字符串从C语言发送到C# . 我目前有一个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.

只有在我为double类型(例如price)分配值时才会发生这种情况 .

2 回答

  • 1

    尽管名称,我不相信 SerializeAsString 真的将它转换成文本 - 所以你不应该将二进制数据解释为UTF-8编码的文本,这是错误的 .

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

  • 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"
    }
    

    对字符串的简单写入将确定这是否正确 . 这种格式与二进制格式没有关系,所以你要尝试反序列化.2408706_ .

    选项(最好到最差顺序)是* Serialise到byte Array和send / retrieve as bytes * Serialise到byte Array和encode / decode byte Array as Base64 *像你一样编码为String并使用String-Deserialise .

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

相关问题