Android 如何将protobuf作为XML的一部分发送
我已经在android中创建了一个Android 如何将protobuf作为XML的一部分发送,android,xml,protocol-buffers,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(Pe
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
构建块的一部分发送
john.toByteArray() and john.toByteString()
到目前为止,我已经看到了以下方法,以便通过网络发送字节
john.toByteArray() and john.toByteString()
但我认为,当我将如下所示嵌入到xml标记中时,它将只是字符串表示,从中我无法获取数据
"<data>" + john.toByteArray() + "</data>"
“”+john.toByteArray()+“”
那么,如何使用XML
传递protobuf
消息呢
注意:我不想使用base64
编码,因为它最终会增加块的大小这里的基本问题是protobuf编码是二进制的,而XML是文本。不能将二进制数据直接嵌入到文本中;您需要以某种方式将其编码为文本
不幸的是,如果不增加数据大小,根本无法做到这一点。如果您关心的是大小,那么base64可能是您的最佳选择——这正是它的设计初衷
另一种可能是使用.toString()
以protobuf文本格式对消息进行编码,然后使用com.google.protobuf.TextFormat
对其进行解析。这将产生一种人类可读的编码,但它将比二进制编码大得多
还有一种选择是编写一个自定义转换器,它使用protobuf反射iterfaces(例如com.google.protobuf.Message#getField()
)读取单个字段并将其转换为嵌套的XML元素。但是,这很复杂,最终可能比protobuf文本格式占用更多的空间。我知道这些选项:
使用此选项。
使用此方法,您可以生成可以嵌入到外部xml中的xml
使用API,尽管解析似乎只可能。
从protobuf到字符串格式:
TextFormat.shortDebugString((myProtobufMessage);
在C++代码中从字符串格式到原Buffm
TextFormat:parseFromString(dataString, &myProtobufMessage);
(我自己没有试过,但我看到了)
使用此方法,您可以生成一个可以嵌入到XML中的字符串,在接收端,获取该字符串并将其转换为protobuf消息对象
使用protobuf>binary>base64-而不是xml
您可能可以在protobuf消息中发送包装XML中的所有数据。我就是这么做的。
使用这种方法,您可以忘记XML,而将protobuf用于所有事情。这是protobuf的最初目的,也是它的最佳用途。那么你知道像WhatsApp
这样的信使正在使用什么方法来高效地发送文件吗?对不起,我不知道WhatsApp
使用什么协议。顺便说一句,请记住,压缩的base64的大小应该与压缩原始二进制数据的大小相似,因为一个好的压缩器将识别出只使用了字符集的一个子集。所以,如果压缩XML,那么base64应该不是问题……我想建议使用base64,但看到了您的注释。它有什么问题?与protobuf相比,它太大了,所以数据负载很大,在这种情况下Base64+gzip应该减小大小,如果内存可用的话?那么你的意思是,你首先将所有数据包装在protobuf中,然后使用xml发送缓冲区,对吗?