我正在學習Scala,以獲得來自Rails的新項目。我已經定義了一個類型,這個類型將被用在我可以基本上被認爲是'屬性'集合的許多模型中。它基本上只是一個HashMap中的包裝,代表大部分的責任吧:當我用Casbah/Salat定義自定義序列化 - 或委託序列化成員?
case class Person(val name: String, val description: Description)
但是:
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
,像堅持用SalatDAO我結束了一個文件,看起來像這樣一個Person
:
{
name : "Russell",
description:
{
attributes:
{
hair: "brown",
favourite_color: "blue"
}
}
}
當實際上我不需要012的嵌套在description
標籤標籤 - 什麼其實我是想是這樣的:
{
name : "Russell",
description:
{
hair: "brown",
favourite_color: "blue"
}
}
我沒有試過,但我想我能得到那個工作,如果我做了Description
延長Map
而不是包含一個,但我'd寧可不是,因爲Description
不是Map
的一種類型,它的某些行爲有一些Map
以及我將在稍後添加的其他行爲。繼承等構成。
所以我的問題是,我怎麼能告訴薩拉特(或卡斯巴,實際上,我有點不清楚哪個是做轉換,因爲我已經只使用它們剛剛開始)如何序列化和反序列化Description
類?在卡斯巴教程here它說:
也可以創建自己的自定義類型的序列化和反序列化 。請參閱自定義序列化器和解串器。
但是這個頁面似乎並不存在。或者我是否以錯誤的方式去做?實際上是否有一種非常簡單的方式來表明這是我想要發生的事情,一個註釋還是什麼?或者我可以簡單地以某種方式將序列化委派給屬性映射?
編輯:具有看看來源爲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
我沒有收到任何錯誤,它只是沒有效果,以前所未有的方式保存文檔。這似乎也相當多,必須做我想要的。
嗨@prasinous,感謝您的回答(並感謝您在Salat上的工作!)。我爲'Description'創建了一個單獨的類的原因是我打算向它添加行爲。我可能還會在未來增加或改變其構成。 – Russell 2012-03-02 13:39:15
(是的,'_id'略去了) – Russell 2012-03-02 13:41:07
鑑於你說過和看測試代碼表明,它可能很難確定哪些特定的地圖需要進行反序列化到'Description'對象,我已經決定稍微改變我的設計,並將其發佈在下面的答案中。再次感謝。 – Russell 2012-03-02 17:05:08