关于数组:如何在protobuf重复字段中发送0?

How to send 0 in protobuf repeated field?

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

1
2
3
4
5
6
7
8
9
syntax ="proto3";

package server;

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


(评论中询问的扩展版本)

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

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

在这种情况下,有问题的代码是:std::strlen(data_.get()).


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

有些地方很不对劲。您的客户端(或可能在您的服务器)中很可能存在错误。