如何解决如何将一系列消息写入文件并使用 protobufprotobuf.js 与 proto3读回?
我尝试了这个例子并且能够让一条消息起作用:
// awesome.proto
package awesomepackage;
Syntax = "proto3";
message AwesomeMessage {
string awesome_field = 1; // becomes awesomeField
}
A complete solution is in my answer in this question。
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");
问题是,我不知道是 AwesomeMessage
还是 AwesomeNameMessage
,那么我们如何继续? protobuf 可以按照上面的方式工作吗,或者我们是否需要定义所有消息类型(无论是 1000 种),然后将它们全部封装到一个消息类型中,例如 Genericmessage
,并以某种方式使用 oneof
声明下一条消息可以是任何消息类型(或使每条消息都 optional
)?它是如何工作的?
解决方法
如果您控制 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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。