我一直在为一个项目实施 IPC 的 protobufs。出于某种原因,未设置/序列化设置为 0 的值。对于上下文,.proto 文件包含以下消息:
syntax = "proto3";
enum SetGet {
SET = 0;
GET = 1;
}
message State {
SetGet setget = 1;
double x = 2;
double y = 3;
double depth = 4;
double yaw = 5;
double pitch = 6;
double roll = 7;
}
我使用 protoc 将文件编译为 Python _pb2 文件,然后尝试运行以下测试脚本:
import filename_pb2 as pb
state = pb.State()
state.x = 0
state.y = 0
state.depth = 0
state.yaw = 0
state.pitch = 0
state.roll = 0
state.setget = pb.SET
print("State: {}".format(state))
state2 = pb.State()
state2.ParseFromString(state.SerializeToString())
print("State2: {}".format(state2))
当我运行它时,会打印以下输出:
State:
State2:
似乎没有设置任何内容,或者零值被某种方式忽略了。但是,当我将值(x、y、深度等)更改为非零值(例如 0.1)时,我得到以下预期结果:
State: x: 0.1
y: 0.1
depth: 0.1
yaw: 0.1
pitch: 0.1
roll: 0.1
State2: x: 0.1
y: 0.1
depth: 0.1
yaw: 0.1
pitch: 0.1
roll: 0.1
即使数字被打印出来,由于某种原因,枚举仍然不是。为什么 protobuf 会发生这种情况?默认情况下 double 类型为 0,因此 protobuf 序列化程序通过忽略它们来节省空间?那么,为什么在解析 State2 时它们没有被恢复呢?我错过了文档中的某些行吗?提前致谢!
——蒂姆