ScalaPB: compilePlugin создает неподходящий класс

#scala #protocol-buffers #scalapb

Вопрос:

Я пытаюсь использовать буферы протоколов для создания классов случаев Scala.

Базовыми настройками являются: 1.In проект/плагины.sbt:

   addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.0")

  libraryDependencies  = "com.thesamet.scalapb" %% "compilerplugin" % "0.10.10"
 

2.In сборка.sbt:

 name := "GeoService"

scalaVersion := "2.12.14"

Compile / PB.targets := Seq(
   scalapb.gen() -> (Compile / sourceManaged).value
)

 libraryDependencies   = Seq(
     "com.thesamet.scalapb" %% "scalapb-runtime" % 
    scalapb.compiler.Version.scalapbVersion % "protobuf"
)
 

Содержит .proto-файл:

  syntax = "proto3";

 package ru.spb.geo.model;

 import "google/protobuf/timestamp.proto";

  message GeoPoint {
       int32 id = 1;
       int32 latitude = 2;
       int32 longitude = 3;
       google.protobuf.Timestamp time = 4;
  }
 

Но в целевом каталоге он генерирует очень странный класс «ГеоПоинт» (часть этого «короткого» класса).:

 @SerialVersionUID(0L)
final case class GeoPoint(
  id: _root_.scala.Int = 0,
  latitude: _root_.scala.Int = 0,
  longitude: _root_.scala.Int = 0,
  time: _root_.scala.Option[com.google.protobuf.timestamp.Timestamp] =
  _root_.scala.None,
       unknownFields: _root_.scalapb.UnknownFieldSet =  
 .scalapb.UnknownFieldSet.empty
      ) extends scalapb.GeneratedMessage with scalapb.lenses.Updatable[GeoPoint] {
     @transient
      private[this] var __serializedSizeCachedValue: _root_.scala.Int = 0
      private[this] def __computeSerializedValue(): _root_.scala.Int = {
         var __size = 0
  
  {
    val __value = id
    if (__value != 0) {
      __size  = _root_.com.google.protobuf.CodedOutputStream.computeInt32Size(1, 
 __value)
    }
  };
  
  {
    val __value = latitude
    if (__value != 0) {
      __size  = _root_.com.google.protobuf.CodedOutputStream.computeInt32Size(2, 
  __value)
    }
  };
 

Ответ №1:

Все работает так, как задумано. Созданный класс case содержит элементы для каждого из полей в прототипе. Остальная часть сгенерированного кода заботится о сериализации и десериализации. Вы можете прочитать больше о сгенерированном коде и о том, как его использовать, здесь: https://scalapb.github.io/docs/generated-code

Комментарии:

1. Спасибо! Я пропустил этот момент