如何使用protobuf编码/解码嵌套消息?

时间:2018-09-06 07:30:02

标签: protocol-buffers

我有一个protobuf结构,它表示结构的嵌套层/信封。对这些数据进行编码时,可以在一组中处理整个层次结构。

但是,当解码时,仅应解码第一个外部信封,并且嵌套的信封需要保持编码以按原样传递给下游,以便由下一个体系结构层进行解码,等等。每层仅了解信封的结构为此。

现在,我为每个信封都有一个单独的原始文件,嵌套的信封在其父级中以字节表示。我不喜欢这种方法,因为它需要维护单独的文件和用于编码的简单代码。

是否有更好的方法来处理此问题?还有一个问题是,使用nanopb时有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

如果您使用的是proto2(而不是proto3),那么这似乎很适合extensions。每个“外部”消息都会定义一个扩展范围,例如(引自doc):

message Foo {
  // ...
  extensions 100 to 199;
}

然后,在“内部”架构中,您可以为父消息声明其他字段-琐碎字段或整个对象:

message Bar { /*...*/ }
extend Foo {
  optional Bar bar = 126;
}

然后,“内部”代码对您选择的框架使用任何“扩展” API;如果您使用的是Google实现,则该方法的范围很广,例如HasExtension()ClearExtension()GetExtension()MutableExtension()AddExtension()-但实现方式不同可能有不同的API。

通过这种方法,“外部”消息永远不会(或不需要)对内部数据的任何了解;图书馆负责处理所有问题。

此方法的优点是使用bytes是按字节的 id -因此,您现有的数据应该与使用过的数据完全兼容:

message Foo {
    optional bytes bar = 126;
}

请注意,proto3 不实现扩展。有一个新的Any概念可以提供广泛的相似的结果,但效果却大不相同。它不是按字节兼容的。