1

次のようなクラス階層があるとします。

trait Event
case class ThisEvent extends Event
case class ThatEvent extends Event
case class AnotherEvent extends Event

現在、シリアライゼーションコードでは、これを使用する必要があります:

implicit val formats = new DefaultFormats {
  override val typeHintFieldName = "_t"
  override val typeHints = ShortTypeHints(List(classOf[ThisEvent], classOf[ThatEvent], classOf[AnotherEvent]))
}

しかし、私は次のようなものを非常に好みます:

implicit val formats = new DefaultFormats {
  override val typeHintFieldName = "_t"
  override val typeHints = ShortTypeHints(List(classOf[Event]))
}

これをどのように解決しますか?

4

1 に答える 1

1

Eventシールされたトレイトを作成できる場合は、ここでSealedExample説明するマクロを使用して、目的のヘルパー メソッドでオブジェクトを導入することにより、そのサブクラスを反復処理できます。この例では、sealed トレイトを拡張するオブジェクトのみを取得しますがclassOf、すべてのサブクラスの を返すように簡単に変更できます。次に、次のことができます。

override val typeHints = ShortTypeHints(SealedExample.values[Event].toList)

それ以外の場合、残念ながら、Scala にはコンパイル時にトレイトのサブタイプのリストを生成するネイティブな方法がありません。

于 2015-04-09T17:03:47.500 に答える