![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
всем доброго времени суток.
хочу сериализовать структуру каталогов ФС. есть следующий тип:
все работает, все хорошо. за исключением одного НО! прежде чем сериализовать объект типа "tree_t", его нужно подготовить. т.е. прочитать структуру каталога, прочитать каждый файл, разбить его на части, загрузить каждую часть в буфер, подсчитать crc32 для каждой части. но этот вариант мне не нравится по нескольким причинам: 1. структура каталога, может занимать много гигов. соответственно, и объем занимаемой памяти требуется такой-же, плюс чуть-чуть. 2. как-то, этот подход, мне кажется "деревянным" и неправильным. вот чего я хочу: чтоб каждый элемент типа "file_t", инициализировался именно в момент его сериализации.
в примере, я создаю структуру каталогов, добавляю в нее файлы, не обрабатывая их. мне нужна возможность, "сообщить" boost.serialization, каким образом "обрабатывать" объекты некоторого типа. в идеале, чтоб можно было "заставить" boost.serialization, выполнить operator() для объектов некоторого типа. благодарен всем отозвавшимся. Это сообщение отредактировал(а) boostcoder - 1.4.2010, 07:55 |
||||
|
|||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Ну делай отложенную загрузку в методе serialize во время непосредственно сериализации.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
W4FhLF, в методе serialize(), инициализировать нет смысла. т.к. все вышеописанные недостатки останутся.
а же хочу инициализировать некоторые типы _непосредственно_при_сериализации_ допустим тип:
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
в данный момент, де/сериализация происходит следующим образом:
как вариант, tree_t разбить на отдельные подтипы. но как назначить для определенного подтипа, его, особенный сериализатор, я тоже не знаю. нужно пробовать.. |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Ленивых вычислений в С++ нет, поэтому напрямую это решить нельзя.
Но я не понимаю почему не реализовать собственные типы. Например реализуй собственный file_t, сделай методы сериализации раздельными (BOOST_SERIALIZATION_SPLIT_MEMBER()), т.е. одну для загрузки другую для сохранения данных. И уже в этих методах грузи/сохраняй данные без их постоянного хранения. Ессно будет работать чуть медленнее, чем если бы всё считал и хранил сразу, но памяти в каждый момент времени будет требоваться столько сколько требуется для одного файла. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
W4FhLF, я так же подумал.
за BOOST_SERIALIZATION_SPLIT_MEMBER() как-то сразу не вспомнил. в общем пробую.. |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
с записью архива разобрался. начать писать чтение, и споткнулся.
объясню в чем проблема... в данный момент, сериализую такой тип:
Добавлено через 7 минут и 29 секунд наверное, этот тип:
так же, придется заменить своим классом....если вариантов других не окажется. Это сообщение отредактировал(а) boostcoder - 1.4.2010, 15:20 |
||||
|
|||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Так значения ключей у тебя записываются при save в архив. В чём именно затык? У буста есть serializers для стандартных типов, он записывает ключи и значения сам в нужном порядке. При чтении грузит их в обратном порядке сам.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
в том, что когда он сериализует тип tree_t, значения ключей в нем уже есть. и сохраняет он значения ключей, сам, без моего вмешательства. но в обратном порядке, мне _нужно_получить_значение_ключа_ до_ вызова file_t::load() Это сообщение отредактировал(а) boostcoder - 1.4.2010, 15:37 |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
А зачем тебе его нужно получать до вызова? Я так понял ты хотел сделать отложенную инициализацию при сохранении. А при загрузке тебе оно зачем? Это всё равно, что взять и расчитать всё заново. Смысл тогда хранить всё это на винте?
Добавлено через 1 минуту и 36 секунд Сохраняй и загружай тогда только ключи, а их значения расчитывай перед сохранеием и после загрузки. Но я не понимаю зачем тогда сохранять значения, если при загрузке ты их всё равно собрался расчитывать. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
наверное я неточно выражаюсь..
Добавлено через 3 минуты и 19 секунд мне нужно сериализовать структуру каталога вместе с _содержимым_файлов_ где, ключи - это имена каталогов "в архиве"(т.к. они являются относительными), а значения - список файлов в этом каталоге. наверное так будет точнее. |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
А зачем тебе получать ключ до вызова file_t::load?
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
потому что ключ - это имя каталога в котором необходимо создать файл, для его десериализации.
|
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
boostcoder, тогда надо хранить структуру каталогов и имён файлов отдельно от их содержимого.
Это сообщение отредактировал(а) W4FhLF - 1.4.2010, 16:37 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
пришло понимание. собственно я так и предположил:
значит придется заменить. сильно благодарен. вопрос закрыт. |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |