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

时间:2013-12-04 15:13:32

标签: android xml protocol-buffers

我在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>"

那么如何通过protobuf传递XML消息?

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

2 个答案:

答案 0 :(得分:0)

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

不幸的是,如果不增加数据大小,就没有办法做到这一点。如果你担心尺寸,base64可能是你最好的选择 - 这正是它的设计目标。

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

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

答案 1 :(得分:0)

这些是我所知道的选项:

  • 使用此3rd party library

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

  • 使用TextFormat API,但解析似乎只能in c
    从protobuf到字符串格式:

    TextFormat.shortDebugString((myProtobufMessage);
    

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

    TextFormat:parseFromString(dataString, &myProtobufMessage); 
    

    (我自己没试过,但我看到了this reference)。

    使用此方法生成可以嵌入XML的String,并在接收端获取该String并将其转换为protobuf Message对象。

  • 使用protobuf&gt;二元&gt; base64 - 而不是的xml。
    您可以在protobuf消息中发送包装XML中的所有数据。这就是我所做的。

    使用此方法,您可以忘记XML并使用protobuf来处理所有事情。这是protobuf的最初目的,这是它最适合的。