我根据原始文件(在下面列出)收集消息。然后,我使用SerializeToString()方法将其序列化为字节字符串。然后,我使用ParseFromString()方法获取字节字符串消息并反序列化为原型对象。 但是,如果我在某些字段中填写零值并执行上述算法,如下所示:
def test():
fdm = device_pb2.FromDeviceMessage()
fdm.deveui = bytes.fromhex('1122334455667788')
fdm.fcntup = 0
fdm.battery = 3.5999999046325684
fdm.mode = 0
fdm.event = 1
port = fdm.data.add()
port.port = 1 #device_pb2.PortData.Name(0)
port.value = 0
c = fdm.SerializeToString()
return c
def parse_test(data):
print(data)
res = device_pb2.FromDeviceMessage()
res.ParseFromString(data)
return res
print(parse_test(test()))
,然后python控制台将向我显示:
deveui: "\021\"3DUfw\210"
battery: 3.5999999046325684
event: PERIOD_EVENT
data {
port: VIBR2
}
没有字段的值为零。
但是我想看看:
deveui: "\021\"3DUfw\210"
fcntup: 0
battery: 3.5999999046325684
mode: BOUNDARY
event: PERIOD_EVENT
data {
port: VIBR2
value: 0
}
为什么会发生,如果已修复,我该如何解决?
============= Proto_File ================
message FromDeviceMessage{
bytes deveui = 1;
uint32 ts = 2;
int32 fcntup = 3;
float battery = 4;
int32 period = 5;
Mode mode = 6;
Event event = 7;
repeated PortData data = 8;
}
message PortData{
DevicePort port = 1;
int32 value = 2;
}
enum Mode{
BOUNDARY = 0;
PERIOD = 1;
BOUNDARY_PERIOD = 2;
}
enum Event{
BOUNDARY_EVENT = 0;
PERIOD_EVENT = 1;
}
enum DevicePort{
VIBR1 = 0;
VIBR2 = 1;
TEMPL2 = 3;
}
答案 0 :(得分:0)
所以,我想我猜到了原因。如果是enum type
(DevicePort,Event,Mode):默认值是第一个定义的枚举值,必须为0。因此,我将设置1个值以查看必填字段。在其他情况下:不显示具有零值的字段以减小程序包的内存大小。但是,如果我使用以下方式转到必填字段:res.data[0].value
(在def parse_test(data)
中),如果我在字段{{1}中设置了值0
,它将显示0
}, 例如。此规则适用于所有情况。