我们正在使用protobuf-net
库来解码基于Inductive Automation - Ignition
有效负载的sparkplug_b.proto
软件提供的MQTT消息。
我们已经使用强大的在线原型工具生成了c#代码。 因此,现在我们可以将binarires消息对象解码为人类可读的JSON了:-) 但是反序列化的Object包含('useless'?)对象,这些对象会使对象实例超载。
为什么不“过滤”对象以提供“精简”对象实例?
例如:
{
"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": ""
}
答案 0 :(得分:0)
这是因为“指标”定义具有一个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#类中生成一个属性。而且,对于每个属性,应该由progengen生成伴随的ShouldSerialize
属性:
public bool ShouldSerializeIntValue() => __pbn__itemValue.Is(10);
并且JSON.NET(Newtonsoft.Json)应该尊重此属性,因此它应该仅序列化oneof
字段所引用的成员,因为所有其他ShouldSerialize
属性都将返回{{1} }。