Scala Avro4s通用toByteArray/fromByteArray
我对Avro4s的toByteArray/fromByteArray函数的通用版本有问题 我找到了这个 这是我的作品:Scala Avro4s通用toByteArray/fromByteArray,scala,scala-macros,scala-reflect,scala-generics,avro4s,Scala,Scala Macros,Scala Reflect,Scala Generics,Avro4s,我对Avro4s的toByteArray/fromByteArray函数的通用版本有问题 我找到了这个 这是我的作品: def fromByteArray[A: SchemaFor : FromRecord](bytes: Array[Byte]): Option[A] = { val in: ByteArrayInputStream = new ByteArrayInputStream(bytes) val input: AvroBinaryInputStream[A] = A
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)方法binary的参数不足:(隐式
证据$23:com.sksamuel.avro4s.SchemaFor[T],隐含证据$24:
com.sksamuel.avro4s.ToRecord[T])com.sksamuel.avro4s.avrobinayoutputstream[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。谢谢提醒。更新了答案。无法为
AnyRef
生成架构,因为它可能是无限多个子类型之一。