我正在为一个来自 Rails 的新项目学习 Scala。我已经定义了一个将在我的许多模型中使用的类型,基本上可以将其视为“属性”的集合。它基本上只是一个 hashmap 的包装器,将它的大部分职责委托给它:
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
}
}
所以我会用 a 定义一个模型类Description
,比如:
case class Person(val name: String, val description: Description)
但是,当我坚持Person
使用 SalatDAO 时,我最终会得到一个如下所示的文档:
{
name : "Russell",
description:
{
attributes:
{
hair: "brown",
favourite_color: "blue"
}
}
}
实际上我不需要在attributes
标签中嵌套description
标签 - 我真正想要的是:
{
name : "Russell",
description:
{
hair: "brown",
favourite_color: "blue"
}
}
我没有尝试过,但我认为如果我Description
扩展 aMap
而不是包含一个,我可以让它工作,但我宁愿不这样做,因为 aDescription
不是 的类型Map
,它具有一些行为aMap
以及它自己的其他行为,我稍后会添加。组合优于继承等等。
所以我的问题是,我如何告诉 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
我没有收到任何错误,它只是没有效果,以与以往相同的方式保存文档。对于我想要的东西,这似乎也有很多事情要做。