17

为了便于在 Scala 中使用 Avro,我想根据存储在 .avro 文件中的模式定义一个案例类。我可以尝试:

  1. 手动编写 .scala 案例类定义。
  2. 以编程方式将字符串写入 .scala 文件
  3. 使用 ObjectWeb 的 ASM 之类的字节码库来欺骗案例类定义
  4. 具体的编译器技巧?
  5. 在运行时修改现有的案例分类定义?

谢谢,任何建议表示赞赏。-朱利安

4

2 回答 2

14

我一直在破解一个名为Scalavro的小项目以另辟蹊径(Scala 类型为 Avro 模式)。它还为您提供直接的二进制 I/O。

简单示例:

package com.gensler.scalavro.tests
import com.gensler.scalavro.types.AvroType

case class Person(name: String, age: Int)

val personAvroType = AvroType[Person]
personAvroType.schema

产生:

{
  "name": "Person",
  "type": "record",
  "fields": [
    {"name": "name", "type": "string"},
    {"name": "age", "type": "int"}
  ],
  "namespace": "com.gensler.scalavro.tests"
}

在项目站点(上面链接)和 scalatest 规范中还有更多示例。

我计划在不久的将来在 Sonatype OSS 上托管二进制文件,但现在你可以从 github 拉取源代码,sbt publish-local如果你想尝试一下。

更新:
Scalavro现在可以在 Maven Central 上使用。

于 2013-05-06T01:51:19.073 回答
2

看起来你在https://github.com/julianpeeters/avro-scala-macro-annotations使用类型提供程序弄脏了你的手

于 2015-01-20T19:12:43.343 回答