如何将protobuf作为XML的一部分发送



我在android中创建了一个protobuf示例代码,如下所示

Person john =
  Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdoe@example.com")
    .addPhone(
      Person.PhoneNumber.newBuilder()
        .setNumber("555-4321")
        .setType(Person.PhoneType.HOME))
    .build();

现在我想通过网络发送这个john对象作为xml构建块的一部分

到目前为止,我已经看到了以下方法,以便我可以通过网络发送bytes

john.toByteArray() and john.toByteString() 

但我认为,当我按照如下方式嵌入xml标签时,它将只是字符串表示,因此我无法返回数据

"<data>" + john.toByteArray() + "</data>"

那么我如何用XML传递protobuf消息呢?

注意:我不想使用base64编码,因为它最终会增加块的大小

这里的根本问题是protobuf编码是二进制的,而XML是文本的。您不能将二进制数据直接嵌入到文本中;你需要以某种方式将其编码为文本。

不幸的是,如果不增加数据大小,根本无法做到这一点。如果你关心的是尺寸,base64可能是你最好的选择——这正是它的设计初衷

另一种可能性是使用.toString()以protobuf文本格式对消息进行编码,然后使用com.google.protobuf.TextFormat对其进行解析。这将产生一个人类可读的编码,但它将比二进制编码大得多。

另一种选择是编写一个自定义翻译器,该翻译器使用protobuf反射迭代面(例如com.google.protobuf.Message#getField())读取各个字段并将它们转换为嵌套的XML元素。然而,这很复杂,最终可能会比protobuf文本格式占用更多的空间。

我知道以下选项:

  • 使用此第三方库

    使用此方法,您可以生成可以嵌入到外部xml中的xml

  • 使用TextFormat API,尽管解析似乎只有在c中才可能。
    从protobuf到字符串格式:
    TextFormat.shortDebugString((myProtobufMessage);
    

    从字符串格式到c++代码中的protobufm

    TextFormat:parseFromString(dataString, &myProtobufMessage); 
    

    (我自己没有尝试过,但我看到了这个参考资料)。

    使用此方法,您可以生成一个可以嵌入到XML中的字符串,在接收端,获取该字符串并将其转换为protobufMessage对象

  • 使用protobuf>binary>base64-而不是xml的
    您可能可以将包装XML中的所有数据发送到protobuf消息中。这就是我所做的。

    使用此方法,您可以忘记XML,并对所有内容使用protobuf。这就是protobuf的最初目的,也是它的最佳用途

  • 最新更新