2017-08-18 10 views
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) 

詳細情報herehere

に、あなたの定義を変更するには

答えて

2

試してください:あなたは具体的なタイプのコンパイラを使用しているときは、自動的に必要なToRecord暗黙の値を見つけることができます。しかし、パラメータ化されたコードでは、コンパイラはこの暗黙的な値を何らかの形で提供することを約束するべきです。

+1

あなたが私に送ったリンクはとても役に立ちました。あなたが書いた定義がほぼそこにあることが分かります。正解は 'def toAvro [T](obj:T)(暗黙的なToRecord [T]、fromR:FromRecord [T])です:GenericRecord = RecordFormat [T] .to(obj)'です。ありがとうございました:) – Rick

+1

@Rick 2番目の答えに暗黙の追加 – Odomontois

関連する問題