1

我的 Protobuf 消息中有以下内容:

enum SegmentType {
     UNKNOWN = 0;
     TYPE_1 = 1;
     TYPE_2 = 2;
     TYPE_3 = 3;
        }
optional SegmentType segment_type = 1 [default = UNKNOWN]

GeneratedEnum我想生成一个字符串,而不是类型,并将值作为特定类型。例如

SegmentType: String = "TYPE_1"

链接解释了如何映射为自定义类型,但我不清楚如何映射为值类型。当我尝试以下操作时,ScalaPB 显示应在 String 伴生类中实现的错误。

implicit val segmentType = TypeMapper[SegmentType, String](_.name)(SegmentType.fromName(_).get)

我怎样才能实现它?还有一种方法可以将Enum消息中的所有类型转换为String?

4

1 回答 1

3

要让编译器拾取隐式类型映射器,您可以将它放在同一个包SegmentType所属的包对象中。

假设您的原型有这样的包声明:

package a.b.c.d;

然后在斯卡拉:

package a.b.c

package object d {
  implicit val segmentType =
    TypeMapper[SegmentType, String](_.name)(SegmentType.fromName(_).get)
}

您也可以将它放在a.b.c.d(例如a.b.ca.ba)的任何父包中。

对于第二个问题,您不能将所有枚举都设为字符串,但可以将给定枚举类型的所有出现都设为字符串,因此您不必单独为每个字段指定自定义类型:

enum SegmentType {
     option (scalapb.enum_options).type = "String";
     UNKNOWN = 0;
     TYPE_1 = 1;
     TYPE_2 = 2;
     TYPE_3 = 3;
}

message F {
  optional SegmentType segment_type = 1; // will be an Option[String]
}
于 2019-05-15T21:23:23.130 回答