Сохранение сложной структуры объектов в файл

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сохранение сложной структуры объектов в файл

Сообщение java73 » 31.07.2018 12:18:11

Друзья, привет.
Чтобы не изобретать велосипед, спрошу сначала здесь - не делал ли кто продвинутый сериализатор объектов для fpc? JSON-RTTI всем практически подходит, но зачем необходимость в наследовании у всех объектов от TPersistent и создания кучи свойств для целей именно сохранения данных, к примеру, взамен СУБД. Объясню, в чем продвинутость я мыслю: объекты имеют иерархическую структуру, наследование, ассоциацию с другими объектами, иногда рекурсивную. Понятно, что речь идет о создании уникального поля, по которому как в СУБД будет происходить связывание, и если кто-то делал подобное, может есть от чего оттолкнуться?
java73
постоялец
 
Сообщения: 230
Зарегистрирован: 21.11.2013 09:08:10

Re: Сохранение сложной структуры объектов в файл

Сообщение serbod » 31.07.2018 13:46:58

TPersistent позволяет автоматом экспортировать объекты с published полями через TWriter. Так работают описания форм *.dfm/*.lfm. Если написать свой вариант TWriter, то можно и в JSON экспортировать, наверное..

Лично я практикую свой вариант сериализации, где объекты сами себя экспортируют/импортируют в IDataStorage (аналог variant с поддержкой словарей - массивов с текстовым индексом), а оттуда можно экспортировать/импортировать в любой формат - JSON, XML, ini, Bencode. Лично я предпочитаю Bencode, он лучше и быстрее всех работает с паскалевскими строками.

С недавних пор думаю написать дополнение к variant с поддержкой словарей. Но не уверен, что получится это сделать на уровне библиотеки, без влезания в компилятор. Скалогрыз, что скажешь?
Аватара пользователя
serbod
постоялец
 
Сообщения: 311
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Сохранение сложной структуры объектов в файл

Сообщение java73 » 31.07.2018 15:05:41

Поясню. Есть абстрактный тип А, у него есть парочка (пока) наследников Б, В. Есть объект Г, в котором имеется поле типа А. А у объектов Б и В имеется поле - список объектов Г. Вот как это всё можно просто сохранить в файл? Остается лишь вводить уникальный ключ для каждого экземпляра, каждого класса. Плюс еще ключ для определения конкретного типа - Б или В. А восстановление данных в два прохода: сначала из одного файла json создаются все объекты, потом по ключу присоединяются друг к дружке (просто иначе пришлось бы мутить рекурсии в тех случаях, когда считывается например объект Б, поле списка объектов Г, в котором имеется ссылка на объект Б, еще не восстановленный...)

Добавлено спустя 21 минуту 45 секунд:
А можно еще вот как:
1 файл json представляет собой массив для списка всех объектов Б и В (допустим к такими значениями, как уникальный номер, название/имя, ссылка на файл с содержимым самого объекта)
остальные файлы json для каждого объекта.
И тогда в начале нужно будет загрузить только первый файл со списком, а после выбора чего-то из списка, загружается и создается объект Б/В и рекурсивно объекты, которые ассоциированы с ним.
При этом при загрузке необходимо еще проверять, не загружен ли объект ранее. Попробую-ка я такую схемку набросать.
java73
постоялец
 
Сообщения: 230
Зарегистрирован: 21.11.2013 09:08:10

Re: Сохранение сложной структуры объектов в файл

Сообщение serbod » 31.07.2018 15:30:45

Достаточно посмотреть, как сохраняются компоненты в файлы dfm/lfm. У каждого компонента есть уникальное Name. Элементы списков (колонки TListView, например) сохраняются по порядку. Привязки объектов по именам или по номеру (для элементов списков). А при чтении из файла объекты нужного типа автоматом создаются (если их классы были зарегистрированы) и заполняются их published properties. Как стандартно сделано присвоение еще не созданных объектов к свойствам - не знаю. У меня присваивается идентификатор объекта, а при обращении к свойству происходит поиск нужного объекта по идентификатору и запоминание найденного, при повторном обращении поиск уже не производится. Пример сходу показать не могу, никак руки не доходили выделить этот механизм из коммерческого проекта в опенсорс.
Аватара пользователя
serbod
постоялец
 
Сообщения: 311
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru