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
.
我们目前运行一个接收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 thansnake_case
.