为什么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.