Re: сериализация - создание при чтении
От: Sergey Россия  
Дата: 11.10.06 07:35
Оценка: 2 (1)
> Давно мучает вопрос, не могу найти элегантного решения.

Язык какой? Элегантность/не элегантность часто зависит от средств, которыми допустимо пользоваться.

> Есть несколько классов с общим предком. В хранилище есть объект одного из этих классов (неизвестно, какого именно). Необходимо загрузить данные из файла.

>
> Создать объект и вызвать у него .load() нельзя, т.к. неизвестен его тип. Получается, что нужно сначала прочитать тип, а потом создать объект и тогда уже загрузить его данные. Тогда получается, нужно создать объекта-хозяина, который этим будет заниматься (хранить указатель, читать тип, создавать объект, вызывать его загрузку, уничтожать и т.д.).

Ну фабрика для создания объектов потребуется в любом случае (желательно, встроенная в язык ). А вот объект-хозяин — не обязательно.

> Тогда получается, что и сохранять такой объект нужно методом того же хозяина, который будет сохранять тип, потом сохранять объект.

>
> Вопрос в чем: все ли здесь верно с точки зрения построения архитектуры?

Недостаточно гибкая архитектура, на мой взгляд. Зачем объект-хозяин должен хранить указатель на созданный объект и заниматься уничтожением объекта? Ведь ты грузишь объект куда-то — вот там, куда загрузил, его можно и уничтожать впоследствии.

> Как решаются такие вопросы в системах сериализации?


Скажем, в boost::serialization данная задача решена так:
Есть глобальная фабрика, умеющая по некоему описателю типа создавать объект (описатель типа тоже является сериализуемым объектом). Есть классы архивов, отдельно input_archive, отдельно output_archive, умеющие читать-писать объекты. Сериализуемый тип предоставляет некий интерфейс для сериализации, о котором знает архив (перегруженные функции serialize для встроенных типов и классов или функции-члены serialize для классов). Объект сохраняется вызовом метода архива (операторы <<, >> или &). Архив при необходимости (если класс сериализуется полиморфно) регистрирует класс в фабрике и записывает/читает в стрим сначала описатель типа (и версию, кстати), потом данные класса. На время загрузки созданными объектами владеет архив (чтобы прибить их в случае возникновения исключений), потом владение передается тому коду, который и вызвал сериализацию. Архив так же отвечает за то, в каком формате писать данные в стрим — просто есть несколько пар архивов, для бинарной, текстовой, xml сериализации.
Posted via RSDN NNTP Server 2.0
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.