Avro4的通用toByteArray / fromByteArray

时间:2018-07-27 08:45:24

标签: scala scala-macros scala-reflect scala-generics avro4s

我对于Avro4s的通用版本toByteArray / fromByteArray函数有问题

我找到了这个Avro serialization with generic type issue

这是可行的:

def fromByteArray[A: SchemaFor : FromRecord](bytes: Array[Byte]): Option[A] = {
    val in: ByteArrayInputStream = new ByteArrayInputStream(bytes)
    val input: AvroBinaryInputStream[A] = AvroInputStream.binary[A](in)
    val result: Option[A] = input.iterator.toSeq.headOption
    input.close()
    result
  }

但这不是!

def toByteArray[T : SchemaFor : FromRecord](obj: T): Array[Byte] = {
    val byteArrayStream = new ByteArrayOutputStream()
    val output = AvroOutputStream.binary[T](byteArrayStream)
    output.write(obj)
    output.close()
    byteArrayStream.toByteArray
  }

它抛出编译异常:

  

错误:(48,44)找不到证据参数的隐式值   键入com.sksamuel.avro4s.ToRecord [T]       val输出= AvroOutputStream.binaryT错误:(48,44)没有足够的参数用于方法二进制:(隐式   证据$ 23:com.sksamuel.avro4s.SchemaFor [T],隐含证据$ 24:   com.sksamuel.avro4s.ToRecord [T])com.sksamuel.avro4s.AvroBinaryOutputStream [T]。   未指定的值参数证据$ 24。       val输出= AvroOutputStream.binaryT

我做错了什么?

更新 愚蠢的错误

def toByteArray[T : SchemaFor : FromRecord](obj: T): Array[Byte] ...

必须

def createByteArray[T : SchemaFor : ToRecord](obj: T): Array[Byte] ...

:D

关于尚未解决的问题

如果类字段之一是AnyRef

val output = AvroOutputStream.binary[T](byteArrayStream)

无法编译:找不到隐式SchemaFor ...

0 个答案:

没有答案