代码之家  ›  专栏  ›  技术社区  ›  nonopolarity

如何将一系列消息写入文件并使用protobuf(protobuf.js with proto3)将其读回?

  •  0
  • nonopolarity  · 技术社区  · 5 年前

    我尝试了这个例子,并且能够得到一条信息:

    // awesome.proto
    package awesomepackage;
    syntax = "proto3";
    
    message AwesomeMessage {
        string awesome_field = 1; // becomes awesomeField
    }
    

    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 然后读回留言

    我写这封信时被卡住了

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

    问题是,我不知道是不是 令人敬畏的信息 或 AwesomeNameMessage ,那么我们如何进行呢?protobuf能否以上述方式工作,或者 我们是否需要定义所有消息类型(可能是1000种),然后将所有消息类型封装到一个消息类型中,例如 GenericMessage ,并以某种方式使用 oneof optional )? 它是如何工作的?

    0 回复  |  直到 5 年前
        1
  •  2
  •   sfphoton    5 年前

    如果您控制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
    }
    
    推荐文章