如何将 protobuf 对象转换为 ByteArray 并在 Swift 中使用 Base64 URL_SAFE 进行编码?

Posted

技术标签:

【中文标题】如何将 protobuf 对象转换为 ByteArray 并在 Swift 中使用 Base64 URL_SAFE 进行编码?【英文标题】:To how convert protobuf object to ByteArray and the encode with Base64 URL_SAFE in Swift? 【发布时间】:2019-07-17 05:05:23 【问题描述】:

android 中,我可以将对象转换为 ByteArray,然后按照下面的代码将其编码为 Base64 (URL_SAFE)

    val myByteArrayObject = protobufObject.toByteArray()
    val meEncodedObject = android.util.Base64.encodeToString.encodeToString(
          myByteArrayObject, android.util.Base64.DEFAULT).trim()

我如何在 Swift 中实现这一点?

【问题讨论】:

我认为swift中没有嵌入的方式。您可以尝试将对象的所有字段写入字节数组。 为什么要否决我的问题?这是一个合理的问题,我向一些 ios 用户询问,然后在网上搜索,但没有找到答案。 你这样做是为了达到什么目的? 我正在从客户端向服务器发送一个 Protobuf 对象。看起来 toByteArray() 是 protobuf 模型 api。显然 Java 生成的代码确实有它(developers.google.com/protocol-buffers/docs/javatutorial),但不是 swift 生成的 protobuf 代码:( @VladyslavMatviienko,我找到了答案并发布了它。在 protobuf 模型 swift 代码中,这是一个非常棘手的条件,它嵌入了这个可以访问的未记录的公共 API。而且名字也完全不同。 【参考方案1】:

找到答案了。

do 
    let protobufSerialized = try protobufObject.serializedData()
    let protobufEncoded = protobufSerialized.base64EncodedString()

    // Do whatever need to be done with the protobufEncoded
 catch   

很难找到的主要隐藏函数是存在于SwiftProtobuf.Message上的serializedData()

【讨论】:

以上是关于如何将 protobuf 对象转换为 ByteArray 并在 Swift 中使用 Base64 URL_SAFE 进行编码?的主要内容,如果未能解决你的问题,请参考以下文章

Golang:如何将 time.Time 转换为 Protobuf 时间戳?

Java:JSON -> Protobuf & 反向转换

使用 Jackson 将 protobuf 转换为 JSON?

Protostuff一键序列化工具Protobuf JAVA实现

C ++ Protobuf到/从JSON转换[关闭]

在 Java 中将 protobuf 转换为 bigquery