Как контролировать порядок полей при преобразовании сообщения protobuf в строку, используя TextFormat в java? - PullRequest
0 голосов
/ 22 марта 2020

У меня есть сообщение protobuf, которое при преобразовании в строку с использованием TextFormat.printToString() выглядит следующим образом: -

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"
}

Определение прототипа выглядит следующим образом

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;
}

Возможно ли отображать description в качестве первого поля при преобразовании прото-сообщения в строку, используя TextFormat.printToString()?

1 Ответ

0 голосов
/ 22 марта 2020

Как вы, наверное, сейчас понимаете, сообщение кодируется в порядке полей - порядке тегов. Это гарантируется методом Message#getAllFields(), который

гарантированно будет отсортированной картой, поэтому итерирование по ней будет возвращать поля в порядке по номеру поля

Поэтому, если вам нужно, чтобы ваше поле описания было первым, вам нужно либо отказаться от всех полей 1-9 до чисел 11-19, либо отказаться от поля description и создать новое сообщение, похожее на это:

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

Извините, вариантов не так много, порядок полей в protobuf (по замыслу) не очень важен / настраивается.

...