首页 > 解决方案 > 如何知道从服务器传入的 protobuf 消息的大小?

问题描述

我有一个服务器客户端应用程序。服务器使用 C++,而客户端使用 C#。当客户端在 Windows 中时,服务器可能在 Linux 实例上运行。因此,我们不能对架构和字节序做出任何假设。我正在使用 protobuf 来回发送数据结构。目前采用的策略是发送一条消息作为头,其中包含下一条消息的大小,这是一个大数据结构。看起来像:

message message_size {
    required fixed64  size = 1;
}

有没有办法知道protobuf将在两端发送多少字节,即上述结构将被序列化为多少字节?

标签: client-serverprotobuf-netprotobuf-c

解决方案


这里的最终问题是根 protobuf 消息没有长度前缀(按设计)。没有明确的商定 API 用于处理开放流上的多条消息,因此基本上:您关心编码和处理的任何长度前缀都可以工作。一种常见的模式是使用带有虚拟字段编号的 protobuf 规则来处理它;在 protobuf-net 的情况下,这就是它SerializeWithLengthPrefixDeserializeWithLengthPrefix作用;但是:这可能不容易从 C++ 中获得。使用固定宽度/字节序规则手动编码长度可能更容易,然后立即转储原始有效负载。


推荐阅读