1
これは、GitHubページのAvro4sに基づいた非常に単純な例です。は、細かいところでです。GenericのAvroシリアライゼーション
object Main extends App {
case class Ingredient(name: String, sugar: Double, fat: Double)
case class Pizza(name: String, ingredients: Seq[Ingredient], vegetarian: Boolean, vegan: Boolean, calories: Int)
val pepperoni = Pizza("pepperoni", Seq(Ingredient("pepperoni", 12, 4.4), Ingredient("onions", 1, 0.4)), false, false, 98)
val hawaiian = Pizza("hawaiian", Seq(Ingredient("ham", 1.5, 5.6), Ingredient("pineapple", 5.2, 0.2)), false, false, 91)
val format = RecordFormat[Pizza]
val recordInAvro = format.to(pepperoni)
printf(s"Avro of Pepperoni: $recordInAvro\n")
}
しかし、私がやりたいことは、このものです:このコードの最後の作品は罰金だにもかかわらず、しかし
object Main extends App {
case class Ingredient(name: String, sugar: Double, fat: Double)
case class Pizza(name: String, ingredients: Seq[Ingredient], vegetarian: Boolean, vegan: Boolean, calories: Int)
val pepperoni = Pizza("pepperoni", Seq(Ingredient("pepperoni", 12, 4.4), Ingredient("onions", 1, 0.4)), false, false, 98)
val hawaiian = Pizza("hawaiian", Seq(Ingredient("ham", 1.5, 5.6), Ingredient("pineapple", 5.2, 0.2)), false, false, 91)
def toAvro[T](obj: T): GenericRecord = RecordFormat[T].to(obj)
val recordInAvro = toAvro[Pizza](pepperoni)
printf(s"Avro of Pepperoni: $recordInAvro\n")
}
、私はコンパイル時間の間に、次のエラーを取得:
Error:(14, 54) could not find implicit value for parameter toRecord: com.sksamuel.avro4s.ToRecord[T]
def toAvro[T](obj: T): GenericRecord = RecordFormat[T].to(obj)
Error:(14, 54) not enough arguments for method apply: (implicit toRecord: com.sksamuel.avro4s.ToRecord[T], implicit fromRecord: com.sksamuel.avro4s.FromRecord[T])com.sksamuel.avro4s.RecordFormat[T] in object RecordFormat.
Unspecified value parameters toRecord, fromRecord.
def toAvro[T](obj: T): GenericRecord = RecordFormat[T].to(obj)
Avroシリアル化をジェネリックで使用するためのヒントを教えてください。ありがとうございました。一言で言えば
def toAvro[T: ToRecord: FromRecord](obj: T): GenericRecord = RecordFormat[T].to(obj)
に、あなたの定義を変更するには
あなたが私に送ったリンクはとても役に立ちました。あなたが書いた定義がほぼそこにあることが分かります。正解は 'def toAvro [T](obj:T)(暗黙的なToRecord [T]、fromR:FromRecord [T])です:GenericRecord = RecordFormat [T] .to(obj)'です。ありがとうございました:) – Rick
@Rick 2番目の答えに暗黙の追加 – Odomontois