首页 > 解决方案 > Avro4s 通用 toByteArray / fromByteArray

问题描述

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

我发现这个带有泛型类型问题的 Avro 序列化

这是有效的:

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 output = 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

我做错了什么?

upd 愚蠢的错误

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 ...

标签: scalascala-macrosscala-reflectscala-genericsavro4s

解决方案


推荐阅读