protobuf:可选属性的值未被清除

protobuf : Optional attributes' values are not cleared

我们目前运行一个接收json消息的python应用程序,使用ParseDict根据给定的字典解析它,序列化它SerializeToString并发送。

# encode.py
from google.protobuf.json_format import ParseDict



payload = ParseDict(data, data_t_v1())
raw_payload = payload.SerializeToString()

这是我们在原始文件中的内容:

//data.proto syntax = "proto2";

message data_t_v1 {
 required uint32 id = 1;
 optional uint32 offset = 2;
 optional uint32 multiplier = 3;
 optional uint32 mask = 4;
 }

但是,当我在测试不同的场景时,我遇到了一个关于可选属性值的问题。这是发生的事情:

测试 1- 发送带有可选值的消息

data = {
"id": 1,
"offset": 2,
"multiplier":10,
"mask": 4294967295 }

测试 2 - 发送没有可选值的相同消息

data = {
"id": 1 }

问题发生在这里:ParseDict 正在返回一个字典,其中的可选属性具有我在测试 1 中设置的旧值。

我想知道是否有办法清除未设置的旧可选值。 谢谢!

您是否为每个测试创建一个新的原型消息实例?

from google.protobuf.json_format import ParseDict

# Create a new msg
msg = your_packge_pb2.data_t_v1()

data = {
  "id": 1,
  "offset": 2,
  "multiplier":10,
  "mask": 4294967295,
}

# Parse data into msg
ParseDict(data, msg)

# Do something with msg
print(msg)

# Create a new msg
msg = your_packge_pb2.data_t_v1()

data = {
  "id": 1,
}

# Parse data into msg
ParseDict(data, msg)

# Do something with msg
print(msg)

NOTE The style guide recommends using PascalCase for message names rather than snake_case.