Python 考虑零值的字节字符串反序列化​;在田野里

Python 考虑零值的字节字符串反序列化​;在田野里,python,protocol-buffers,proto,Python,Protocol Buffers,Proto,我根据我的原始文件(如下所列)收集邮件。然后我使用SerializeToString()方法将其序列化为字节字符串。然后我使用ParseFromString()方法获取字节字符串消息并反序列化为proto对象。 但如果我填写一些字段零值并执行上述算法,如下所示: def test(): fdm = device_pb2.FromDeviceMessage() fdm.deveui = bytes.fromhex('1122334455667788') fdm.fcntup

我根据我的原始文件(如下所列)收集邮件。然后我使用SerializeToString()方法将其序列化为字节字符串。然后我使用ParseFromString()方法获取字节字符串消息并反序列化为proto对象。 但如果我填写一些字段零值并执行上述算法,如下所示:

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
}
为什么会发生这种情况?如果已经解决了,我该如何解决

================原始文件================

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;
}

所以,我想我猜到了原因。在案例
枚举类型
(DevicePort、Event、Mode)中:默认值是第一个定义的枚举值,该值必须为0。因此,我将设置1个值以查看必填字段。在其他情况下:不显示具有零值的字段以减小包的内存大小。但是,如果我以这种方式转到必填字段:
res.data[0].value
(在
def parse\u test(data)
中)它将显示
0
,例如,如果我在field
value
中设置值
0
。这条规则适用于所有情况。

所以,我想我猜到了原因。在案例
枚举类型
(DevicePort、Event、Mode)中:默认值是第一个定义的枚举值,该值必须为0。因此,我将设置1个值以查看必填字段。在其他情况下:不显示具有零值的字段以减小包的内存大小。但是,如果我以这种方式转到必填字段:
res.data[0].value
(在
def parse\u test(data)
中)它将显示
0
,例如,如果我在field
value
中设置值
0
。这条规则适用于所有情况