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