protobuf 3.0中的任何字节和字节有什么区别?

时间:2017-09-08 02:35:38

标签: byte protocol-buffers message any

我们知道,我们可以使用序列化和反序列化API在bytes和消息之间进行转换,同时,我们可以使用packunpack API来转换{{ 1}}和消息。我的问题是: protobuf 3.0中anyany之间有什么区别? 如商店大小,速度等。

3 个答案:

答案 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"

这会在您的消息中添加不可忽略的字节数。