我正在嘗試使用 proto3 和 scalapb,但我無法映射FiniteDuration,也無法將其用作Option. 任何人都可以請提供相同的建議
case class Message(id:Int , interval: Option[FiniteDuration])
uj5u.com熱心網友回復:
鑒于您按照安裝指南中的描述在 sbt 中配置了 scalabp
您需要為要轉換的欄位定義自定義型別,int64默認情況下映射Long為FiniteDuration
例如:
syntax="proto3";
import "scalapb/scalapb.proto";
option java_package = "my.app.proto";
message Message {
int32 id = 1;
optional int64 interval = 2 [(scalapb.field).type = "scala.concurrent.duration.FiniteDuration"];
}
這將生成一個看起來你需要的案例類。
ScalaPB 將依賴隱式決議來編譯它并應用從Long到 的映射FiniteDuration。為此,您需要scalapb.TypeMapper[Long, FiniteDuration]在package object生成 case 類的同一個包中定義一個in ,即my.app.proto.message.
package my.app.proto
import scalapb.TypeMapper
import java.util.concurrent.TimeUnit
import scala.concurrent.duration.FiniteDuration
package object message {
implicit val finiteDuration: TypeMapper[Long, FiniteDuration] =
TypeMapper[Long, FiniteDuration](s => FiniteDuration.apply(s, TimeUnit.MILLISECONDS))(_.toMillis)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358556.html
