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

时间:2018-10-09 08:59:19

标签: c# json protobuf-net

我们正在使用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": ""
}

1 个答案:

答案 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} }。