0

さまざまな種類のオブジェクトを json と xml にシリアル化する必要があるシステムがあります。それらの一部は Lift MetaRecords であり、一部はケース クラスです。型クラスを使用して、次のようなものを作成したかったのです。

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

そして、json、xml、および拡張用のオープンの通常の実装。

私が今直面している問題は、シリアル化そのものです。現在、オブジェクトがシリアル化されるさまざまなコンテキストがあります。ニュース フィード システムを想像してみてください。User、Post (フィード要素)、Photo の 3 つのオブジェクトがあります。これらのオブジェクトにはいくつかのプロパティがあり、相互に参照できます。同じケースで、オブジェクトのみをシリアライズしたい (ユーザー設定、設定など) 他の場合には、他のオブジェクトもシリアライズする必要があります。フィード: リスト[投稿] + 関連写真。そのためには、参照されるオブジェクトを提供する必要があります。

私の現在の実装は、オプションのパラメーター化された関数で肥大化しています。

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

ある種のコンテキスト ソリューションを実装することを考えました。必要なデータを提供する暗黙のコンテキスト パラメーターで feedAsJson をオーバーロードします。おそらくケーキパターンでデータベースに触れるので、まだどのように実装したいかわかりません。どんな提案でも大歓迎です。

4

2 に答える 2

1

必要な適切な種類のシリアライザーを作成するスコープに Implicit を配置できませんか? その趣旨の何か:

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)

継承されるトレイトでデフォルトのシリアライズ可能なインスタンスを定義する必要があります (優先度の低い暗黙がスコープ内にあるように)。

Serializable の特性は次のとおりであると想定していることに注意してください。

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

([T]メソッド型の引数がなく、 を返しますJObject)

于 2013-08-06T06:39:46.853 に答える
0

「Scala Pickling」が役立つかもしれません:

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

ちょうどプレゼンテーションを見ました。

よろしくポール

于 2013-08-06T21:43:18.457 に答える