【问题标题】:How to generate protobuf Enum as String using ScalaPB?如何使用 ScalaPB 将 protobuf 枚举生成为字符串?
【发布时间】:2019-10-03 01:28:33
【问题描述】:

我的 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"

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

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

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

【问题讨论】:

    标签: protocol-buffers scalapb


    【解决方案1】:

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

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

    package a.b.c.d;
    

    然后在 Scala 中:

    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]
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2023-03-04
    • 2016-07-30
    • 1970-01-01
    • 2019-10-23
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多