我有一个 ProtoBuf 对象。我想检测特定字段何时使用默认值,而不是明确提供。
message vector_measurement
{
measurement x = 1;
measurement y = 2;
measurement z = 3;
}
...
message measurement
{
...
float value = 2;
...
}
Run Code Online (Sandbox Code Playgroud)
当我使用HasField它时返回True,但情况显然不是这样:
message vector_measurement
{
measurement x = 1;
measurement y = 2;
measurement z = 3;
}
...
message measurement
{
...
float value = 2;
...
}
Run Code Online (Sandbox Code Playgroud)
字符串表示似乎知道z正在使用默认值;我怎样才能自己检测到这一点?
您可以通过调用消息来检查消息是否为默认ByteSize()消息:
print(c.x.ByteSize())
# 5
print(c.z.ByteSize())
# 0
Run Code Online (Sandbox Code Playgroud)
但是,请注意,对于每个默认值都是如此,而不仅仅是那些未随消息一起发送的值。换句话说,如果每个组件值都明确设置为与默认值完全匹配,它将报告ByteSize()==0:
print(c.x, c.x.ByteSize())
#myBool: true
#stdDev: 1.06
#value: 14.32
# 12
c.x.myBool = False
print(c.x, c.x.ByteSize())
#stdDev: 1.06
#value: 14.32
# 10
c.x.value = 0
print(c.x, c.x.ByteSize())
#stdDev: 1.06
# 5
c.x.stdDev = 0
print(c.x, c.x.ByteSize())
# 0
Run Code Online (Sandbox Code Playgroud)
ProtoBuf3 中的空消息和具有默认值的消息之间没有区别。
| 归档时间: |
|
| 查看次数: |
4246 次 |
| 最近记录: |