私は Rails から来た新しいプロジェクトのために Scala を学んでいます。基本的に「属性」のコレクションと考えることができる多くのモデルで使用されるタイプを定義しました。これは基本的に、ほとんどの責任を委任するハッシュマップの単なるラッパーです。
case class Description(attributes: Map[String, String]) {
override def hashCode: Int = attributes.hashCode
override def equals(other: Any) = other match {
case that: Description => this.attributes == that.attributes
case _ => false
}
}
したがってDescription、次のようなを使用してモデル クラスを定義します。
case class Person(val name: String, val description: Description)
ただし、PersonSalatDAO を使用して永続化すると、次のようなドキュメントになります。
{
name : "Russell",
description:
{
attributes:
{
hair: "brown",
favourite_color: "blue"
}
}
}
実際には、attributesタグ内のdescriptionタグのネストが必要ない場合-実際に欲しいのはこれです:
{
name : "Russell",
description:
{
hair: "brown",
favourite_color: "blue"
}
}
私は試していませんが、 aを含むのではなくDescriptiona を拡張した場合、それを機能させることができると思いますが、 aは の型ではないため、それはaおよびそれ自体の他の動作については、後で追加します。継承より合成など。MapDescriptionMapMap
だから私の質問は、どうすれば Salat (または Casbah、私はそれらを使い始めたばかりなので、どちらが変換を行っているかについては実際には少し不明です) に、Descriptionクラスをシリアル化および逆シリアル化する方法を伝えることができますか? ここのcasbahチュートリアルでは、次のように述べています。
独自のカスタム タイプのシリアライザーとデシリアライザーを作成することもできます。カスタムシリアライザーとデシリアライザーを参照してください。
しかし、このページは存在しないようです。それとも、間違った方法で進んでいますか?これが私がやりたいこと、注釈などであることを示す本当に簡単な方法は実際にありますか? または、シリアライゼーションを何らかの方法で属性マップに委任することはできますか?
編集: JodaTime 変換ヘルパーのソースを見た後、次のことを試しましたが、まだ動作させることができませんでした:
import org.bson.{ BSON, Transformer }
import com.mongodb.casbah.commons.conversions.MongoConversionHelper
object RegisterCustomConversionHelpers extends Serializers
with Deserializers {
def apply() = {
super.register()
}
}
trait Serializers extends MongoConversionHelper
with DescriptionSerializer {
override def register() = {
super.register()
}
override def unregister() = {
super.unregister()
}
}
trait Deserializers extends MongoConversionHelper {
override def register() = {
super.register()
}
override def unregister() = {
super.unregister()
}
}
trait DescriptionSerializer extends MongoConversionHelper {
private val transformer = new Transformer {
def transform(o: AnyRef): AnyRef = o match {
case d: Description => d.attributes.asInstanceOf[AnyRef]
case _ => o
}
}
override def register() = {
BSON.addEncodingHook(classOf[Description], transformer)
super.register()
}
}
呼び出しRegisterCustomConversionHelpers()てから保存するPersonと、エラーは発生しません。効果がなく、これまでと同じ方法でドキュメントを保存します。これはまた、私が望むことのためにしなければならないことがかなり多いようです。