Пара вопросов про сериализацию и полиморфизм

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

Вопрос №1:

Если у меня есть сложный объект, который параметризирован с использованием динамического и статического (шаблоны) полиморфизма, то какой способ полной сериализации такого объекта является наиболее правильным и наименее страшным?

Вопрос №2:

Насколько нормальной является ситуация частичной сериализации, при которой сериализуется только наполнение объекта, но не его топология и не используемые составными частями реализации компонентов?

Обобщенный пример:

Рассмотрим сверточную нейронную сеть. Она состоит из множества частей - слои, фильтры, ядра, карты. Каждая часть управляется через соответствующий обобщенный интерфейс, за которым может скрываться десяток различных реализаций. В общем виде устройство такой сети очень напоминает дерево виджетов.

Сеть параметризируется как шаблонными аргументами, так и динамическими полиморфными реализациями. Теоретический анализ возможности полной сериализации такой сложной штуки наводит меня на мысль о том, что полная сериализация слишком сложна и нежелательна. Как минимум потому, что концепции взаимоотношений между элементами сети продуманы таким образом, чтобы свести к минимуму возможность неправильного использования.

У реализаций нет конструкторов по умолчанию - это концептуальное требование. Имеющиеся конструкторы задают топологию и устройство элементов достаточно жестко, соответственно - даже если добавить в обобщенные интерфейсы компонентов метод Deserialize(), то он сможет лишь наполнять уже сформированный объект (с известной реализацией), то есть десериализовать состояние уже сконструированного объекта, топология и внутренняя реализация которого уже заданы.

Теоретически, каждый объект можно десериализовать полностью, но учитывая полиморфность и древовидность структуры сети, мы должны реализовать какой-то отдельный управляющий тип, который каким-то некрасивым образом будет собирать сеть в обход уже имеющегося, продуманного и отлаженного интерфейса. Например, путем использования спецификатора friend.

То есть, частичная сериализация является неким компромиссом. Во-первых, добавление в сеть новых реализаций компонентов не будет требовать обновления логики сериализаци/десериализации, потому что эта логика использует обобщенные интерфейсы составных компонентов сети. Во-вторых, у нас не возникает необходимости построения объектов сети при десериализации в обход имеющихся интерфейсов. Единственный минус такого подхода - перед десериализацией необходимо предварительно сформировать сеть, которая будет аналогична той, которая использовалась при сериализации.

Вот такие вопросы у меня есть. Буду признателен за любую полезную информацию по описанной проблеме.


Ответы (0 шт):