Я использую circe для сериализации / десериализации некоторых достаточно больших моделей, где каждое поле листа является сильным типом (например, case class FirstName(value: String) extends AnyVal
).
Неявное разрешение / вывод Encoder
или Decoder
выполняется медленно.
У меня есть собственный кодек, для которого я добавляю несколько дополнительных экземпляров Encoder
и Decoder
:
trait JsonCodec extends AutoDerivation {
// ...
}
С помощью следующего метода, помогающего с декодированием:
package json extends JsonCodec {
implicit class StringExtensions(val jsonString: String) extends AnyVal {
def decodeAs[T](implicit decoder: Decoder[T]): T =
// ...
}
}
Проблема в том, что каждый раз, когда я вызываю decodeAs
, он неявно получает Decoder
, что приводит к значительному увеличению времени компиляции.
Есть ли способ (в общем) кэшировать имплициты, чтобы он генерировал Decoder
только один раз?
StringExtensions
классе. Но всякий раз, когда вы вызываете свойdecodeAs
метод, вы можете сначала сделать это:implicit val tDecoder: Decoder[T] = derieveDecoder
(изменитьT
на свой собственный тип). Таким образом, все вызовыdecodeAs[T]
будут использовать val вместо получения нового декодера. Примечание. Если ваша модель состоит из многих вложенных типов, создайте декодеры для каждого из них в обратном порядке. - person Luis Miguel Mejía Suárez   schedule 29.01.2019Decoder
для каждогоimplicit val
. Единственный способ, который я могу придумать, - это разместить все эти декодеры для ваших типов какimplicit val
s в некоторых глобально известных статических местах, таких как сам объект пакетаjson
. Тогда может быть только один такойimplicit val
для каждого раза, и компилятор может использовать эти однажды полученные значения каждый раз, когда такиеDecoder
необходимы (при условии, что выimport
их в своем контексте). - person SergGr   schedule 29.01.2019