为什么protobuf-net反序列化对象不是'lean'
why is protobuf-net deserialized object not 'lean'
我们正在使用 protobuf-net
库来解码 Inductive Automation - Ignition
软件提供的基于 sparkplug_b.proto
负载的 MQTT 消息。
我们已经使用出色的在线原型工具生成了 c# 代码。
所以现在我们能够解码二进制消息对象,例如人类可读的 JSON :-)
但是反序列化后的Object包含('useless'?)个对象,重载了对象实例。
为什么对象不"filtered"提供一个'lean'对象实例?
例如:
{
"Body": null,
"Metrics": [
{
"Alias": 0,
"BooleanValue": false,
"BytesValue": null,
"DatasetValue": null,
"Datatype": 4,
"DoubleValue": 0,
"ExtensionValue": null,
"FloatValue": 0,
"IntValue": 0,
"IsHistorical": false,
"IsNull": false,
"IsTransient": false,
"LongValue": 0,
"Metadata": null,
"Name": "bdSeq",
"Properties": null,
"StringValue": "",
"TemplateValue": null,
"Timestamp": 1538568112852
}
],
"Seq": 18446744073709551615,
"Timestamp": 1538568112852,
"Uuid": ""
}
那是因为 Metric 定义有一个 oneof
字段:
message Metric {
// ...
oneof value {
uint32 int_value = 10;
uint64 long_value = 11;
float float_value = 12;
double double_value = 13;
bool boolean_value = 14;
string string_value = 15;
bytes bytes_value = 16; // Bytes, File
DataSet dataset_value = 17;
Template template_value = 18;
MetricValueExtension extension_value = 19;
}
message MetricValueExtension {
extensions 1 to max;
}
}
对于这些成员中的每一个,都会在 C# class 中生成一个 属性。而且,对于每个 属性,一个伴随的 ShouldSerialize
属性 应该由 protogen 生成:
public bool ShouldSerializeIntValue() => __pbn__itemValue.Is(10);
和JSON.NET(Newtonsoft.Json)应该尊重这个属性,所以它应该只序列化oneof
字段引用的成员,因为所有其他ShouldSerialize
属性将 return false
.
我们正在使用 protobuf-net
库来解码 Inductive Automation - Ignition
软件提供的基于 sparkplug_b.proto
负载的 MQTT 消息。
我们已经使用出色的在线原型工具生成了 c# 代码。 所以现在我们能够解码二进制消息对象,例如人类可读的 JSON :-) 但是反序列化后的Object包含('useless'?)个对象,重载了对象实例。
为什么对象不"filtered"提供一个'lean'对象实例?
例如:
{
"Body": null,
"Metrics": [
{
"Alias": 0,
"BooleanValue": false,
"BytesValue": null,
"DatasetValue": null,
"Datatype": 4,
"DoubleValue": 0,
"ExtensionValue": null,
"FloatValue": 0,
"IntValue": 0,
"IsHistorical": false,
"IsNull": false,
"IsTransient": false,
"LongValue": 0,
"Metadata": null,
"Name": "bdSeq",
"Properties": null,
"StringValue": "",
"TemplateValue": null,
"Timestamp": 1538568112852
}
],
"Seq": 18446744073709551615,
"Timestamp": 1538568112852,
"Uuid": ""
}
那是因为 Metric 定义有一个 oneof
字段:
message Metric {
// ...
oneof value {
uint32 int_value = 10;
uint64 long_value = 11;
float float_value = 12;
double double_value = 13;
bool boolean_value = 14;
string string_value = 15;
bytes bytes_value = 16; // Bytes, File
DataSet dataset_value = 17;
Template template_value = 18;
MetricValueExtension extension_value = 19;
}
message MetricValueExtension {
extensions 1 to max;
}
}
对于这些成员中的每一个,都会在 C# class 中生成一个 属性。而且,对于每个 属性,一个伴随的 ShouldSerialize
属性 应该由 protogen 生成:
public bool ShouldSerializeIntValue() => __pbn__itemValue.Is(10);
和JSON.NET(Newtonsoft.Json)应该尊重这个属性,所以它应该只序列化oneof
字段引用的成员,因为所有其他ShouldSerialize
属性将 return false
.