1

我有一个 protobuf 文件,我在其中定义了多个消息,这些消息都继承了相同的特征(使用option (scalapb.message).extends = "Event";消息定义内部)。

我想创建一个名为 MultiEvent 的新消息,其中可能包含从 Event 继承的任何消息的序列。

trait Event事件在 scala 代码中被定义为简单。

这个想法是能够一次发送包含多个消息的特殊消息。

syntax = "proto3";

import "scalapb/scalapb.proto";

package com.some.package;

message A {
  option (scalapb.message).extends = "Event";
  string name = 1;
}

message B {
  option (scalapb.message).extends = "Event";
  string field = 1;
}

message C {
  option (scalapb.message).extends = "Event";
  string otherField = 1;
}

message MultiEvent {
  option (scalapb.message).extends = "Event";
  repeated Event seq = 1; // this line is problematic
}

我得到了错误:"Event" is not defined.。理想情况下,从代码中该字段将是一个简单的 Seq,它重复提供,但它仅适用于标量类型。我在互联网上发现 Any 可能能够完成我想要的,但是在尝试使用它时会出错。

解决此类问题的通常方法是什么?枚举?转换?

谢谢。

4

1 回答 1

1

通常的方法是oneof(在协议缓冲区 3 中)。repeated oneof是非法的:

重复 oneof 是在最初的提议中,但正如我们后来发现的那样,wire 和 API 中有很多复杂的极端情况。我们决定不为 oneof 添加重复。

您始终可以定义一个包含 oneof 的消息,并改为使用该消息的重复字段。

所以

message Event {
  oneof sealed_value {
    A a = 1;
    B b = 2;
    C c = 3;
    ...
  }
}

然后repeated Event就像你现在拥有的那样。

使用sealed_value作为名称启用 ScalaPB 的密封oneof支持。

于 2019-08-14T14:06:54.597 回答