1

我尝试了该示例,并且能够使一条消息起作用:

// awesome.proto
package awesomepackage;
syntax = "proto3";

message AwesomeMessage {
    string awesome_field = 1; // becomes awesomeField
}

我对这个问题的回答中有一个完整的解决方案。

protobuf 是否能够让我们将多种消息类型写入文件并读回它们?(或通过网络,一条接一条的消息)。

而且我认为强大的是,我们可以“混合和匹配”消息类型?(意思可以是Message1,然后是Message2两三遍,完全可以是动态的?)

所以假设我们有

// awesome.proto
package awesomepackage;
syntax = "proto3";

message AwesomeMessage {
    string awesome_field = 1; // becomes awesomeField
}

message AwesomeNameMessage {
    string awesome_name = 1; // becomes awesomeName
}

我只是按照 protobufjs 网站中的示例,写入AwesomeMessage一个文件,然后创建AwesomeNameMessage并将其连接到同一个文件。

现在是否可以在不知道数据文件中有哪些消息类型的情况下read.js写和读回消息?

我写的时候卡住了read.js

  const AwesomeMessage = root.lookupType("awesomepackage.AwesomeMessage");

问题是,我不知道它是AwesomeMessageor AwesomeNameMessage,那么我们该如何进行呢?protobuf 可以按照上面的方式工作,还是我们需要定义所有消息类型(可能是 1000 个),然后将它们全部封装到一个消息类型中,例如GenericMessage, 并以某种方式用于oneof声明下一条消息可以是任何消息类型(或制作每条消息optional)?它是如何工作的?

4

1 回答 1

2

如果您控制 protobuf 协议规范,则添加保存消息的类型可能是个好主意。

// awesome.proto
package awesomepackage;
syntax = "proto3";

message MessageList {
    repeated AbstractMessage msgs = 1;
}

message AbstractMessage {
    oneof msgtype {
        AwesomeMessage awesomeMessage = 2;
        AwesomeNameMessage awesomeNameMessage = 3;
        ...
    }
}

message AwesomeMessage {
    string awesome_field = 1; // becomes awesomeField
}

message AwesomeNameMessage {
    string awesome_name = 1; // becomes awesomeName
}
于 2021-05-03T15:21:56.370 回答