Mam komunikat Protobuf, który po przekonieniu na łańcuch za pomocą TextFormat.printToString() wygląda poniżej: -

deploymentDef {
  id: "PX3C1ED"
  default: true
  type: ONPREM
  limits {
    clusterSize: 3
    limits {
      numVMs: 18000
      numVMsWithFlows: 18000
      activeFlows: 6000000
      totalFlows: 24000000
      flowPlanning: 4000000
      numDevices: 40
    }
  }
  isEnterprise: false
  brickSize: XLARGE
  clusterSize: 3
  description: "Default Role, Non-Enterprise, App-Discovery and Vf services stopped"
}

Definicja proto wygląda poniżej

message DeploymentDef {
    optional string id = 1;
    optional bool default = 2;
    optional DeploymentType type = 3;
    optional PlatformClusterLimits limits = 4;
    repeated Role roles = 5;
    optional bool isEnterprise = 6;
    optional Configs overrides = 7;
    optional BrickSize brickSize = 8;
    optional int32 clusterSize = 9;
    optional string description = 10;
}

Czy można wyświetlić description jako pierwsze pole podczas konwersji wiadomości proto na ciąg za pomocą {x1}}?

0
tuk 22 marzec 2020, 17:07

1 odpowiedź

Najlepsza odpowiedź

Jak prawdopodobnie rozumiesz teraz, wiadomość jest zakodowana w kolejności pól - kolejność tagów. Jest to zagwarantowane przez Message#getAllFields() metoda, która

gwarantuje, że jest posortowaną mapą, więc iterating nad nim powróci pola w kolejności przez numer pola

Dlatego, jeśli potrzebujesz pola opisu, aby być pierwszym, albo będziesz musiała deprecjonować i przenieść wszystkie pola 1-9 do numerów 11-19 lub deprecjonować pole description i utworzyć nową wiadomość podobny do tego:

message Deployment {
    optional string description = 1;
    required DeploymentDef deploymentDef = 2;
}

Przepraszamy, nie ma wielu lepszych opcji, kolejność pól w Protobuf jest (według projektowania) niezbyt ważna / konfigurowalna.

0
Petr Janeček 22 marzec 2020, 14:26