2

我有一个原型消息:

syntax = "proto3";

import "google/protobuf/any.proto";

message Task {
    repeated google.protobuf.Any targets = 1;
    // ...
}

message Target {
    string name = 1;
    // ...
}

我应该如何将目标消息添加到Task.targets

在官方文档中,我找到了有关如何将值分配给单个Any类型值的信息,但是在我的情况下,我有repeated Any字段类型。

编辑Task.targets可能包含不同类型的目标,这Any就是使用 type 的原因。单个Target消息仅用于最小的可重现示例。

4

4 回答 4

2

谢谢@贾斯汀·舍恩。根据https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/Any,您需要先创建一个 Any 对象,然后打包一个 Target (或任何其他对象类型)在将其附加到重复列表之前。

from google.protobuf.any_pb2 import Any
task = Task()
target = Any()
target.Pack(Target())
task.targets.append(any)
于 2019-11-15T20:53:53.630 回答
0

After searching for an answer myself, I found this thread to be the most relevant so I'll post my solution here if it helps anyone (but in Java/Scala).

If you want

repeated google.protobuf.Any targets = 1;

and targets can be any value such as (string, bool, int, etc). This is how I did it in scala/java:

val task = Task.newBuilder()
    .addTargets(Any.pack(StringValue.of("iss")))
    .addTargets(Any.pack(Int32Value.of(25544)))
    .addTargets(Any.pack(DoubleValue.of(1004.882447947814)))
    .addTargets(Any.pack(DoubleValue.of(84.90917890132)))
    .addTargets(Any.pack(DoubleValue.of(14.620929684)))
    .addTargets(Any.pack(StringValue.of("kilometers")))
    .build()
于 2021-01-12T04:31:47.230 回答
0

我对该any类型的了解有限,但我认为可以将其视为消息repeated列表。Target

蟒蛇代码:

task_targets = []
task_targets.append(<insert_pb2_import>.Target(name='test'))
return <insert_pb2_import>.Task(targets=task_targets)
于 2019-06-03T14:31:24.037 回答
-1

在玩了一段时间后,我决定修改使用重复 Any 的解决方案。这里是给那些被困在同一个地方的人的建议:尝试使用特定类型而不是Any.

针对我的情况,一种解决方法是创建包含特定目标的 、 等SpecificTargetSet1类型的消息。原型文件如下所示SpecificTargetSet2Task

message Task {
    google.protobuf.Any target_set = 1;
}

目标集 proto 文件:

message SpecificTargetSet1 {
    repeated SpecificTarget1 targets = 1;
}

现在可以通过以下方式创建任务:

target = Target()
target.name = "Some name"

target_set = SpecificTargetSet1()
target_set.targets.append(target)

task = Task()
task.target_set.Pack(target_set)

我没有将我的答案标记为正确,因为它只是一种解决方法。

于 2019-06-03T14:58:00.277 回答