使用Google Protocol Buffer和Protobuf-C#将双重属性从C++转移到C#的问题

本文关键字:转移 C++ 问题 属性 Buffer Protocol Google Protobuf-C# 使用 | 更新日期: 2023-09-27 18:22:04

我正试图通过消息系统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.

只有当我将值分配给诸如price之类的双重类型时,才会发生这种情况。

使用Google Protocol Buffer和Protobuf-C#将双重属性从C++转移到C#的问题

尽管有这个名字,但我不认为SerializeAsString真的会将其转换为文本,所以您不应该在C#端将其视为文本。我强烈怀疑是将二进制数据解释为UTF-8编码的文本出错了。

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

正如Jon Skeet所说,我认为SerializasString将在其文本表示中返回协议缓冲区(请参阅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#,所以不能建议代码使用