почему десериализованный объект protobuf-net не «худой» - PullRequest
0 голосов
/ 09 октября 2018

Мы используем библиотеку protobuf-net для декодирования MQTT-сообщений, предоставляемых из программного обеспечения Inductive Automation - Ignition, основанного на полезной нагрузке sparkplug_b.proto.

Мы создали код 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": ""
}

1 Ответ

0 голосов
/ 09 октября 2018

Это связано с тем, что определение 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:

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

И JSON.NET (Newtonsoft.Json) должен уважать это свойство, поэтому он должен только сериализовать член, которыйупомянутое поле oneof, потому что все другие свойства ShouldSerialize вернут false.

...