我在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
从protobuf到字符串格式:
TextFormat.shortDebugString((myProtobufMessage);
从字符串格式到c++代码中的protobufm
TextFormat:parseFromString(dataString, &myProtobufMessage);
(我自己没有尝试过,但我看到了这个参考资料)。
使用此方法,您可以生成一个可以嵌入到XML中的字符串,在接收端,获取该字符串并将其转换为protobufMessage对象
您可能可以将包装XML中的所有数据发送到protobuf消息中。这就是我所做的。
使用此方法,您可以忘记XML,并对所有内容使用protobuf。这就是protobuf的最初目的,也是它的最佳用途