如何将重复的protobuf消息打包到Any中

问题描述 投票:0回答:1

我正在使用消耗

com.google.protobuf.Any
的第三方服务。我需要传入一个
repeated Message myObject
对象,但是如何将重复的 protobuf 字段打包到 Any 中?

我正在按照

fun List<Message>.toProtobufAny(): com.google.protobuf.Any {...}
的思路编写一个 Kotlin 扩展函数,以(希望)使该函数适用于任何消息,因为我将发送各种重复的消息类型。我的第一次尝试是实现
Any.pack(RepeatedFieldBuilder<>)
,但语法尚未成功。没有找到关于这个特定用例的很多代码示例。

谢谢。

编辑以包含示例

@ILYAS_Kerbal

我设置了一条基本消息来保存重复的 Anys 列表

message RepeatedAny {
    repeated google.protobuf.Any values = 1;
}

然后创建了几个扩展函数来支持它......


/**
 * Given a list of protobuf messages, create a protobuf.Any
 */
fun List<Message>.toProtoAny(): Any {
    val repeatedAny = RepeatedAny.newBuilder().addAllValues(
        this.map { msg -> msg.toProtoAny() }
    ).build()

    return repeatedAny.toProtoAny()
}

/**
 * Pack a protobuf.Message into a protobuf.Any
 */
fun Message.toProtoAny(): Any = this.packAny()

/**
 * Pack a protobuf.Message into a protobuf.Any
 */
private fun Message.packAny(): Any =
    Any.pack(this, "$defaultAnyLibrary/${this.javaClass.name}")

希望有帮助

java kotlin protocol-buffers
1个回答
1
投票

Any
包含单个原型,而不是重复字段。

您可以创建一个

List<Any>
、您自己的
AnyRepeated
原型,或者包含一个具有适合您选择的消息类型的
Any
原型字段的原型的
repeated
,但您不能将多个原型打包到一个
Any
.

© www.soinside.com 2019 - 2024. All rights reserved.