17

ScalaでのAvroの操作を容易にするために、.avroファイルで保存されたスキーマに基づいてケースクラスを定義したいと思います。私は試すことができます:

  1. .scalaケースクラス定義を手動で記述します。
  2. プログラムで.scalaファイルに文字列を書き込む
  3. ObjectWebのASMのようなバイトコードライブラリでケースクラス定義を偽装します
  4. SpecificCompilerのトリック?
  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がMavenCentralで利用できるようになりました。

于 2013-05-06T01:51:19.073 に答える
2

https://github.com/julianpeeters/avro-scala-macro-annotationsでタイププロバイダーに手を汚したようです

于 2015-01-20T19:12:43.343 に答える