如何知道从服务器传入的 protobuf 消息的大小?
How to know size of protobuf message incoming from server?
我有一个 server-client 应用程序。服务器使用 C++,而客户端使用 C#。当客户端在 Windows 中时,服务器可能在 Linux 实例上 运行。因此,我们不能对体系结构和字节顺序做出任何假设。我正在使用 protobuf 来回发送数据结构。目前采用了一种发送消息的策略 header ,其中将包含下一条消息的大小,这是一个大型数据结构。看起来像:
message message_size {
required fixed64 size = 1;
}
有什么方法可以知道protobuf会在两端发送多少字节,也就是上面的结构会被序列化成多少字节?
这里的最终问题是根 protobuf 消息没有长度前缀(设计)。对于通过开放流处理多条消息,没有明确商定 API,所以基本上:您关心编码和处理的任何长度前缀都可以工作。一种常见的模式是使用带有虚拟字段编号的 protobuf 规则来处理它;在 protobuf-net 的情况下,这就是 SerializeWithLengthPrefix
和 DeserializeWithLengthPrefix
所做的;但是:这可能不容易从 C++ 获得。使用 fixed-width/endianness 规则手动编码长度可能更容易,然后立即转储原始负载。
我有一个 server-client 应用程序。服务器使用 C++,而客户端使用 C#。当客户端在 Windows 中时,服务器可能在 Linux 实例上 运行。因此,我们不能对体系结构和字节顺序做出任何假设。我正在使用 protobuf 来回发送数据结构。目前采用了一种发送消息的策略 header ,其中将包含下一条消息的大小,这是一个大型数据结构。看起来像:
message message_size {
required fixed64 size = 1;
}
有什么方法可以知道protobuf会在两端发送多少字节,也就是上面的结构会被序列化成多少字节?
这里的最终问题是根 protobuf 消息没有长度前缀(设计)。对于通过开放流处理多条消息,没有明确商定 API,所以基本上:您关心编码和处理的任何长度前缀都可以工作。一种常见的模式是使用带有虚拟字段编号的 protobuf 规则来处理它;在 protobuf-net 的情况下,这就是 SerializeWithLengthPrefix
和 DeserializeWithLengthPrefix
所做的;但是:这可能不容易从 C++ 获得。使用 fixed-width/endianness 规则手动编码长度可能更容易,然后立即转储原始负载。