У меня есть система, где мне нужно сериализовать различные объекты для 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 с неявным параметром контекста, который предоставит необходимые данные. Я не знаю, как бы я хотел его реализовать, поскольку он касается базы данных, возможно, с шаблоном пирога. Любые предложения очень ценятся.
Я хочу добавить как JSON и XML сериализаторы, следовательно, общая функция в сериализуемом признаке. – Lukasz
@ Lukasz, тогда вы можете создать две параллельные иерархии сериализаторов под двумя отдельными объектами или пакетом и выполнить импорт Serializable.Xml._' или 'import Serializable.JSon._', чтобы получить имплициты. Другой способ - иметь как 'serializeXML', так и' serializeJson' методы в 'Serializable'. По крайней мере, кажется, что это должно быть 'trait Serializable [To] {def сериализовать [From] (from: From): To}' вместо того, чтобы использовать 'T' всюду. – huynhjl