gpt4 book ai didi

c# - 为什么protobuf-net反序列化对象不是 'lean'

转载 作者:太空宇宙 更新时间:2023-11-03 14:48:56 31 4
gpt4 key购买 nike

我们正在使用 protobuf-net 库来解码 Inductive Automation - Ignition 软件提供的 MQTT 消息,该软件基于 sparkplug_b.proto 有效负载。

我们已经使用出色的在线原型(prototype)工具生成了 C# 代码。所以现在我们能够解码二进制消息对象,例如人类可读的 JSON :-)但是反序列化的对象包含('无用'?)对象,这些对象会重载对象实例。

为什么不“过滤”对象以提供“精简”对象实例?

例如:

{
"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# 类中生成一个属性。而且,对于每个属性,一个伴随的 ShouldSerialize 属性应该由 protogen 生成:

public bool ShouldSerializeIntValue() => __pbn__itemValue.Is(10);

而 JSON.NET (Newtonsoft.Json) 应该尊重这个属性,所以它应该只序列化 oneof 字段引用的成员,因为所有其他 ShouldSerialize 属性将返回 false

关于c# - 为什么protobuf-net反序列化对象不是 'lean',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52717102/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com