Я написал библиотеку, в которой пользователи могут предоставлять пользовательские реализации полей некоторого класса. Теперь оказывается, что мой библиотечный код должен сериализовать эти классы в json, что кажется невозможным для библиотек, которые мне нравятся circe
или argonaut
.
Вот упрощенный пример
case class LibraryObject(field: FieldOfCustomType, otherField: String)
trait FieldOfCustomType
import argonaut.Argonaut._
import argonaut.ArgonautShapeless._
// won't work, no instance of EncodeJson[FieldOfCustomType]
libraryObject.asJson.nospaces
и это имеет смысл для меня. Я чувствую, что должен позволить пользователю разрешить им определять пользовательский сериализатор / десериализатор. Но я не знаю, как сделать это решение чистым, так как мой нынешний подход кажется хакерским:
// require user to include implementation on classpath
trait FieldOfCustomTypeJsonFactory {
def toJson(obj: FieldOfCustomType): String
def fromJson(json: String): FieldOfCustomType
}
Я действительно надеюсь, что у некоторых из вас есть лучшие идеи. Но я боюсь, что я ничего не могу с этим поделать из-за характера проблемы во время выполнения.