LINUX.ORG.RU

[c++]serialization


0

0

Здравствуйте уважаемые! У меня возникла потребность в такой штуке. Не знаю есть ли такая или нет. 1) Система должна выполнять хранение объектов переменной длины. 2) Быстрая загрузка выгрузка объектов с заданными параметрами. 3) Итерация по объектам в файле. Не нужно загружать объекты по одному. Итерация должна быть такой, чтобы объекты загружались в память по несколько штук, количество единовременно загружаемых объектов должно настраиваться. 4) Необходимо, чтобы система предусматривала «сеанс» работы пользователя с данным файлом или бд. Сеанс должен хранить хэндлы или указатели или идентификаторы записей в файле последних N запросов , с целью уменьшить время поиска по файлу. 5) Необходимо чтобы система позволяла хранить либо объекты любых классов, либо ее можно было легко научить хранить объекты различных классов.

В общем это что-то типа сериализации дб. В общем у меня такая идея, что нужно создать абстрактный класс в котором будут функции, которые нужно обучить. Что собственно требуется:

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

В общем можнет есть готовое что-то? ТОлько не нужно sqllite и др предлагать. Просто сложно будет организовать хранение объектов содержащих списки. PS Да, чуть не забыл. Не нужно предлагать так же системы где без акрабатических цирковых номеров и «ОЛе АПП!» не обойтись. Система должна быть такой чтобы можно было просто. Унаследовал, научил одну две функции и ура все работает.


В плюсах нет reflection и прочей метаинформации (rtti гумно), но... вполне возможно что кути которые это добавили что-то подобное реализовали.

wfrr ★★☆ ()
Ответ на: комментарий от wfrr

Блин! Тема стара как говно динозавров. Не ужели никто еще этого не создал?!

jeep ()

QT умеет сериализовывать объекты через потоки

http://qt.nokia.com/doc/4.5/qdatastream.html#details

Только вместо файла нужно будет использовать QByteArray + QBuffer.

http://qt.nokia.com/doc/4.5/qbuffer.html#details

Далее этот QByteArray запихиваешь в базу. Добавление сериализации кастомных классов, насколько я понимаю, делается определением operator<<.

Достаточно тебе этого функционала и допустимо ли использование QT в твоем проекте - решать тебе.

Liosha_Syrnikov ()

> Не нужно предлагать так же системы где без акрабатических цирковых номеров и «ОЛе АПП!» не обойтись.

Боюсь, что там сплошная акробатика для сипипи. А так, ищи по теме «Объектные базы данных» (ODBMS). Там есть и хранение, и итерация, и даже «горячий кеш» с распределенностью.

Лет десять назад направление бурно развивалось. До пришествия явы и дотнета. Фиг знает, в каком состоянии сейчас.

dave ★★★★★ ()

самый лучший вариант - google protobuf. остальные либо тормозные (boost::serialization), либо дурацкие (boost::serialization, qt, ACE), либо сложные (ASN.1)

anonymous ()

В MFC у CObject (емнип, поправте если не так) есть виртуальный метод Serialize (CArchive &ar), и в унаследованных классах его можно, ессно, переопределить.

Там, в зависимости от режима, можно было читать/записывать значения переменных объекта:

ar << m_instVar1 << instVar2 << instVar3 << ...;

Самый тупой и прямой подход.

Ну а так - язык не тот, да, для таких задач. Любое решение будет в какой то степени кривым.

P.S. Посмотри на ORM для плюсов, если они есть, как там делаются аналогичные вещи

yoghurt ★★★★★ ()
Ответ на: комментарий от yoghurt

> Ну а так - язык не тот, да, для таких задач. Любое решение будет в какой то степени кривым.

Язык-то нормальный. Но будет очень, очень сложно по сравнению с другими языками. Тем не менее, навороченные CAD-системы используют именно сpp и ODBMS. Это если нужна супер-скорость. Во многих случаях она на фиг не сдалась ;)

Для cpp даже есть (был) стандартизированный API интерфейс.

dave ★★★★★ ()
Ответ на: комментарий от Liosha_Syrnikov

Поздно на кути переносить -я уже на wxWidgets почти все написал.

jeep ()

ты самое главное не написал — нужно ли версионирование, т.е. чтобы ты добавил пару полей к классу, перекомпилировал... и после этого смог прочитать *старые* сохраненные объекты

если это не нужно (и можно напревать на ендианность), то такая система пишется в 500 строк

Необходимо чтобы система позволяла хранить либо объекты любых классов, либо ее можно было легко научить хранить объекты различных классов T.

Делаешь PersistentRoot с виртуальным деструктором и кучу его потомков Persistent<T>. Подробнее у страуструпа и даже я тут на форуме постил.

www_linux_org_ru ★★★★★ ()
Ответ на: комментарий от www_linux_org_ru

разве там рефлексия?

«The purpose of the GCC-XML extension is to generate an XML description of a C++ program from GCC's internal representation. Since XML is easy to parse, other development tools will be able to work with C++ programs without the burden of a complicated C++ parser. »

anonymous ()

Да нет этого в Си++ и не будет... Иначе это будет не Си++. А вообще пару хороших вещей - ZeroC Ice сериализация да Protobuf. Boost Serialization - сраное тормознутое гуано. Не все то хорошо, что в Бусте -)

Manhattan ()

Короче, хранить в бинарнике данные нужда отпала. Короче, мне думаю хватит простого xml. Проблема теперь в другом. Поэтому и тема будет другая. Спасибо всем. Ознакомился с нектороыми объектными бд.

jeep ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.