如何在 protobuf 重复字段中发送 0?

How to send 0 in protobuf repeated field?

例如,当我尝试发送具有这些值 [14,56,0,63,22,6] 的数组时,我的客户端只收到 零 [14,56] 之前的值。我知道默认值没有序列化,但是这个 0 在重复字段中。那么是否可以使用 protobuf 消息通过网络发送整个数组?

syntax = "proto3";

package server;

message SrvPossibleMoves {
  int32 id = 1;
  int32 index = 2;
  repeated int32 moves = 3 [packed=false];
}

So is it possible to send the whole array over the wire with protobuf message?

是:0作为重复字段中的值绝对没有特殊含义。您可以发送 5 个 0,或 20,或 201——这完全没有区别。

my client receives only the values before the zero

出了点问题。您的客户端(或可能在您的服务器)很可能存在错误。

(评论中的扩展版查询)

这听起来是典型的中间代码问题(不是 protobuf 库本身,而是在传递字节时出现的问题)将有效负载视为 C 风格(以 nul 结尾)的字符串。这种情况下的零值将被编码为零字节,这在二进制数据中是完全有效的,但这会导致 C 风格的字符串处理 API 在该点切割数据。我会 期望 大多数 protobuf 库检测到它期待额外的值(在某些情况下这是可能的,而在某些情况下是不可能的;在这种情况下 - 它似乎是可能的),并在此时抛出异常,但是......那将是特定于库的。

因此:检查 C 风格字符串处理的代码,并删除任何此类 - 通常通过一致传递长度和有效负载(而不是依赖终止符)。


在这种情况下,违规代码是:std::strlen(data_.get())