2013-08-06 67 views
0

我有系統需要將不同類型的對象序列化爲json和xml。其中一些是Lift MetaRecords,一些是案例類。我想使用類型類,並創建類似的東西:在Scala中設計序列化庫,類型爲

trait Serializable[T] { 
    serialize[T](obj: T): T 
} 

而通常的實現json,xml和打開的擴展。

問題我現在面對的是序列化本身。目前,有不同的對象序列化的上下文。想象一下新聞饋送系統。有三個對象:用戶,發佈(提要元素)和照片。這些對象有一些屬性,可以互相引用。現在,在相同的情況下,我想單獨序列化對象(用戶設置,首選項等),在其他情況下,我還需要其他對象進行序列化。 Feed:列出[發佈] +相關照片。爲了做到這一點,我需要提供引用的對象。

我目前的實現是臃腫的可選參數化函數。

def feedAsJson(post: MPost, grp: Option[PrivateGroup], commentsBox: Option[List[MPostComment]] = Empty): JObject 

我想過實施某種上下文解決方案。用隱式上下文參數重載feedAsJson,它將提供必要的數據。我不知道我想如何實現它,因爲它可能與蛋糕模式觸及數據庫。任何建議非常讚賞。

回答

1

難道你不能把範圍內的implicits,將創建你需要的正確類型的序列化?諸如此類的話:

def doNothingSerializer[T]: Serializable[T] = ??? 
implicit def mpostToJson(implicit pgs:Serializable[PrivateGroup]], 
            cmts:Serializable[List[MPostComment]]) = 
    new Serializable[MPost] { 
    def serialize(mpost: MPost): JObject = { 
     val privateGroupJSon = pgs.serialize(mpost.privateGroup) 
     // make the mpost json with privateGroupJSon which would be empty 
     ??? 
    } 
} 

// later where you need to serialize without the inner content: 
implicit val privateGroupToJson = doNothingSerializer[PrivateGroup] 
implicit val mpostCommentsToJson = doNothingSerializer[List[MPostComment]] 
implicitly[Serializable[MPost]].serialize(mpost) 

您需要的特質,其隨後繼承定義默認序列化的情況下(讓low priority implicits在範圍內)。

請注意,我假設用於可序列化的特點是:

trait Serializable[T] { 
    def serialize(t: T): JObject 
} 

(無[T]方法類型參數,返回JObject

+0

我想補充兩個JSON和XML序列化,因此在可序列化特徵的通用功能。 – Lukasz

+1

@Lukasz,那麼你可以在兩個單獨的對象或包下創建兩個串行器的並行層次結構,並執行'import serializable.Xml._'或'import Serializable.JSon._'來獲取蘊含。另一種方法是在Serializable中同時使用'serializeXML'和'serializeJson'方法。至少它似乎應該是'trait Serializable [To] {def serialize [From](from:From):To}'而不是在任何地方使用'T'。 – huynhjl

0

也許「斯卡拉酸洗」可以幫助你:

http://lampwww.epfl.ch/~hmiller/pickling

我剛看了演示文稿。

問候 保羅

+0

序列化本身不是我想解決的問題。我需要解決代碼結構,使其易於擴展和可重用。然後我會插入已完成的序列化。 – Lukasz