我在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
编码,因为它最终会增加块的大小
答案 0 :(得分:0)
这里的基本问题是protobuf编码是二进制,而XML是文本。您不能将二进制数据直接嵌入到文本中;你需要以某种方式将其编码为文本。
不幸的是,如果不增加数据大小,就没有办法做到这一点。如果你担心尺寸,base64可能是你最好的选择 - 这正是它的设计目标。
另一种可能性是使用.toString()
以protobuf文本格式对消息进行编码,然后使用com.google.protobuf.TextFormat
对其进行解析。这将产生一个人类可读的编码,但它将比二进制编码大得多。
另一个选择是编写一个自定义翻译器,它使用protobuf反射iterfaces(例如com.google.protobuf.Message#getField()
)来读取单个字段并将它们转换为嵌套的XML元素。然而,这很复杂,最终可能会占用比protobuf文本格式更多的空间。
答案 1 :(得分:0)
这些是我所知道的选项:
使用此方法,您可以生成可嵌入外部xml中的xml
TextFormat.shortDebugString((myProtobufMessage);
从字符串格式到c ++代码中的protobufm
TextFormat:parseFromString(dataString, &myProtobufMessage);
(我自己没试过,但我看到了this reference)。
使用此方法生成可以嵌入XML的String,并在接收端获取该String并将其转换为protobuf Message对象。
使用此方法,您可以忘记XML并使用protobuf来处理所有事情。这是protobuf的最初目的,这是它最适合的。