例如,当我尝试发送具有这些值[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];
}
答案 0 :(得分:1)
那么有可能通过protobuf消息通过导线发送整个阵列吗?
是:对于重复字段中的值0,绝对没有特殊含义。您可以发送5个0或20个或201个-绝对没有区别。
我的客户只收到零之前的值
有些事情是非常错误的。您的客户端(或服务器中)很可能存在错误。
答案 1 :(得分:1)
(注释中查询的扩展版本)
这听起来是中间代码(不是protobuf库本身,而是传递字节时的东西)存在的典型问题,正在将有效载荷视为C样式(以零结尾)的字符串。在这种情况下,零值将被编码为零字节,这在二进制数据中是完全有效的,但是这将导致C风格的字符串处理API在那一点上剪切数据。我会期望大多数protobuf库来检测是否期望附加值(在某些情况下这是可能的,在某些情况下是不可能的;在这种情况下-似乎是可能的),并且此时抛出一个异常,但是...这将是特定于库的。
因此:检查代码以进行C样式的字符串处理,并删除所有此类代码-通常通过一致地传递长度和有效负载(而不是依赖终结符)。
在这种情况下,有问题的代码是:std::strlen(data_.get())
。