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 风格字符串处理的代码,并删除任何此类 - 通常通过统一传递长度和有效负载(而不是依赖终止符)。
在这种情况下,有问题的代码是:
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
有些地方很不对劲。您的客户端(或可能在您的服务器)中很可能存在错误。