我们知道,我们可以使用序列化和反序列化API在bytes
和消息之间进行转换,同时,我们可以使用pack
和unpack
API来转换{{ 1}}和消息。我的问题是:
protobuf 3.0中any
和any
之间有什么区别?
如商店大小,速度等。
答案 0 :(得分:0)
2.0和3.0之间没有协议差异;理论上你的数据应该是相同的。
在库级别处理默认值和零值的方式可能存在一些细微差别 - 在3.0"必需"和"可选"不存在,相反:零没有传输(一切都是有效可选的,默认为零)。这意味着以前当您可能已明确指定零值时,它可能已被传输。现在不会。当然,这也意味着在3.0中根本不可能实现非零默认值。
重点:第二段中的所有内容都在序列化程序级别,而不是协议级别。该协议完全没有改变。
答案 1 :(得分:0)
我在这个问题上也被困住了。但是我在网上找不到任何答案-Proto3中的Any Type在网上没有得到很好的记录,特别是对于C ++。因此,我尝试了两者,区别在于const formData = new FormData();
formData.append('image', files[0]);
fetch(url, {
method: 'POST',
body: data
}).then(...);
和Any
序列化的内容。 bytes
序列化任何 Message ,而Any
序列化任何字符串(在C ++中)。
以下是“任何”的代码段:
bytes
但是,对于// Proto file containing message description for Foo
#include "foo_proto.grpc.pb.h"
// Proto file containing message description for AnyMessage,
// which uses google.protobuf.Any
#include "any_proto.grpc.pb.h"
Foo *foo = new Foo(); // Foo is the message defined in "foo_proto.proto"
// ... Set the variables for message Foo
// Pack Foo into 'Any' message type
Any* any = new Any();
any->PackFrom(*foo);
// Use the above 'Any' message to create AnyMessage object
AnyMessage am;
am.set_allocated_object(any);
,您需要打包一个字符串类型,而不是Any对象。因此,bytes
的代码片段可能如下所示:
bytes
答案 2 :(得分:0)
我可以看到的唯一主要区别是,Any添加了一个额外的“ @type”字段,这是从中打包邮件的字符串URL名称。它添加的URL字段示例:
@type = "type.googleapis.com/packagename.messagename"
这会在您的消息中添加不可忽略的字节数。