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