0

我有一个 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()

4

1 回答 1

0

正如您现在可能理解的那样,消息是按照字段的顺序编码的——标签的顺序。这是由以下Message#getAllFields()方法保证的

保证是一个排序的映射,因此对其进行迭代将按字段编号的顺序返回字段

因此,如果您需要将您的描述字段作为第一个字段,则需要弃用所有字段 1-9 并将其移至数字 11-19,或者弃用该description字段,并创建类似于以下内容的新消息:

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

抱歉,没有更好的选择,protobuf 中的字段顺序(按设计)不是很重要/可自定义。

于 2020-03-22T14:26:40.403 回答