Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将protobuf作为XML的一部分发送_Android_Xml_Protocol Buffers - Fatal编程技术网

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

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

我已经在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
构建块的一部分发送

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发送缓冲区,对吗?