2013-08-06 5 views
0

У меня есть система, где мне нужно сериализовать различные объекты для json и xml. Некоторые из них - Lift MetaRecords, некоторые из них - классы case. Я хотел бы использовать классы типов и создать что-то вроде:Проектирование библиотеки сериализации в Scala с классами классов

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

И обычные реализации для JSON, XML и открыты для расширения.

Проблема, с которой я сейчас сталкиваюсь, - это сама сериализация. В настоящее время существуют различные контексты, в которых объекты сериализуются. Представьте себе систему подачи новостей. Существует три объекта: «Пользователь», «Почта» (элемент «Подача») и «Фото». Эти объекты имеют некоторые свойства и могут ссылаться друг на друга. Теперь в тех же случаях я хочу сериализовать объект самостоятельно (пользовательские настройки, настройки и т. Д.), В других случаях мне нужны и другие объекты, которые будут сериализованы, а именно. Feed: List [Post] + связанные фотографии. Для этого мне нужно предоставить объекты, на которые ссылаются.

Моя текущая реализация раздута с дополнительными параметризованными функциями.

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

Я думал о реализации какого-либо контекстного решения. Перегрузка feedAsJson с неявным параметром контекста, который предоставит необходимые данные. Я не знаю, как бы я хотел его реализовать, поскольку он касается базы данных, возможно, с шаблоном пирога. Любые предложения очень ценятся.

ответ

1

Не можете ли вы поместить импликации в область видимости, которая создаст нужные вам сериализаторы, которые вам нужны? Что-то по этому поводу:

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 находятся в области видимости).

Обратите внимание, что я предполагаю, что черта для Serializable есть:

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

(нет [T] метода аргумента типа и возвращаю JObject)

+0

Я хочу добавить как JSON и XML сериализаторы, следовательно, общая функция в сериализуемом признаке. – Lukasz

+1

@ Lukasz, тогда вы можете создать две параллельные иерархии сериализаторов под двумя отдельными объектами или пакетом и выполнить импорт Serializable.Xml._' или 'import Serializable.JSon._', чтобы получить имплициты. Другой способ - иметь как 'serializeXML', так и' serializeJson' методы в 'Serializable'. По крайней мере, кажется, что это должно быть 'trait Serializable [To] {def сериализовать [From] (from: From): To}' вместо того, чтобы использовать 'T' всюду. – huynhjl

0

Может быть, «Скала Травление» может помочь вам:

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

Я просто смотрел презентацию.

С уважением Пол

+0

Сериализация сама по себе не является проблемой, которую я пытаюсь решить. Мне нужно решить структуру кода, чтобы он был легко расширяемым и многоразовым. Затем я подключу сериализацию, которая уже выполнена. – Lukasz