Велосипед для сериализации графа объектов на основе аттрибутов
От: LWhisper  
Дата: 25.09.15 06:54
Оценка:
Всем привет!

Хочется запилить велосипед для сериализации произвольного графа объектов с ручным управлением этой самой сериализацией на основе аттрибутов.
Чтобы катался быстро и без тряски, не мешал другим компонентам системы, а колёса от старого подходили к новому.

Что не устраивает в Serializable — неподконтрольная сборка сериалайзеров, неэффективное использование памяти, сложности с версионностью.
Что нравится — отдельная сборка, которая позволяет шустро сериализовать и десериализовать объекты без необходимости держать в памяти кэш динамических сериалайзеров.

Что не устраивает в ISerializable и его родичах — необходимость ручного описания процесса сериализации. Монстроузный механизм версионности.
Что нравится — сейчас всё построено на нём и ничего переделывать не нужно, вот только список сериализуемых объектов постоянно дополняется, некоторые из них видоизменяются, и на написание бесконечных сериалайзеров уходит уйма времени.

Чего хочется добивиться — описать все механизмы сериализации декларативно, аттрибутами. Сериализовать любые объекты, помеченные этими аттрибутами в байтики и превращать непонятные наборы байт в исходные объекты, притом, что сборки и типы в них могут меняться (добавилось новое поле, другое стало опциональным).

Разобрать всё это при помощи рефлекшена до уровня примитивов и .NET-типов (List, Array, Enumerable, String), снабдив последние отдельными сериализаторами, не составляет труда. Но вопрос — как это сделать эффективно. В секунду может обрабатываться до сотни объектов. Их число медленно ползёт к пятистам. Городить какую-то Lazy-инфраструктуру с кэшированием и динамической компиляцией экспрешенов в домене приложения не хочется совершенно.

В связи с чем, вижу это либо как возможность самостоятельной генерации сборки сериализаторов (и тогда вопрос — как?), либо в виде отдельного сервиса (и тогда вопрос — как с ним взаимодействовать без потерь производительности?).
Если у кого-то был подобный опыт — поделитесь, пожалуйста.

P.S. Любое дополнительное моделирование для кодогенерации не рассматривается. Этим никто заниматься не будет. Есть класс, его нужно сериализовать. Минимум кода, максимум производительности, читабельности и гибкости.
net c# serialization
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.