scala - 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 ...
解决方案
推荐阅读
- unit-testing - 使用 b 按钮“to”对 vue 路由进行单元测试
- r - 如何重复对数据进行子集化并跨 R 中的列执行函数?
- amazon-web-services - 连接到私有 VPC 的 AWS Lambda 无法启动/停止 EC2 实例
- java - Spring boot 允许用户同时登录超过一次(已解决)但它无法重定向到特定网页(仍然无法正常工作)
- haskell - 变量不在范围内:x :: Picture (Haskell)
- javascript - MVC 中的 ajax 调用导致“主线程上的 xmlhttprequest 已弃用”警告
- ios - SwiftUI ForEach 视图第一次没有更新
- r - 使用操作按钮的闪亮渲染图
- sql-server - 触发器未按预期工作以计算累积运行时间
- python - 如何将字典列表中的值与输入值进行比较