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

问题描述 投票:1回答:1

我有一个protobuf结构,代表结构的嵌套层/包络。对此数据进行编码时,可以在一个集合中处理整个层次结构。

然而,当解码时,仅解码第一外部包络,并且嵌套包络需要保持编码以在下游传递,以便由下一个架构层等进行解码。每层只知道用于它的信封的结构。 。

现在我为每个信封都有一个单独的原型文件,嵌套的信封在父项中表示为字节。我不喜欢这种方法,因为它需要维护单独的文件和非平凡的编码代码。

有没有更好的方法来处理这个?还有一个额外的问题,使用nanopb有更好的方法吗?

protocol-buffers
1个回答
4
投票

如果你正在使用proto2(而不是proto3),这似乎非常适合extensions。每个“外部”消息将定义扩展范围,例如(从文档引用):

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

然后在“内部”模式中,您可以为父消息声明其他字段 - 无关紧要的字段或整个对象:

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

然后,“内部”代码使用“扩展”API为您选择的框架提供的任何内容;如果您正在使用Google实现,那么这是一系列方法,如HasExtension()ClearExtension()GetExtension()MutableExtension()AddExtension() - 但不同的实现可能有不同的API。

通过这种方法,“外部”消息永远不会(或需要)任何内部数据的知识;图书馆处理所有这些。

这种方法的好处在于它与使用qazxsw poi有点相同 - 所以如果您使用过,现有数据应完全兼容:

bytes

请注意,proto3不实现扩展。有一个新的message Foo { optional bytes bar = 126; } 概念提供了大致相似的结果,但工作方式却截然不同。它不是字节兼容的。

© www.soinside.com 2019 - 2024. All rights reserved.