2012-11-14 2 views
0

Я спрашиваю здесь, потому что я уже пытался искать, но я понятия не имею, существуют ли эти вещи и какие их имена.Сериализация с пользовательским шаблоном и произвольным доступом с Boost

Я начинаю объяснять, что с пользовательским шаблоном я подразумеваю это: предположим, что мне нужно сериализовать объекты или данные типа foo, bar и boo, обычно библиотека обрабатывает это для пользователя очень простым способом, вначале в процессе сериализации, поэтому, если я сериализую все foo, сначала они пишутся «вверху» файла, а все панели и boo после foo.

Теперь я хотел бы сохранить заказ в своем файле и упорядочить вещи на основе пользовательского шаблона, это возможно с помощью Boost? В каком разделе представлена ​​эта функция?

Второе, что строго связано с первым, я также хотел бы получить доступ к моим сериализованным двоичным файлам таким образом, что я не вынужден анализировать и читать все предыдущие значения, чтобы извлечь только тот, который я Мне интересно, как RAM, которая работает на основе адреса памяти и предлагает произвольный доступ, не заставляя вас разбирать все остальные адреса.

Спасибо.

ответ

1

По первому вопросу: библиотека сериализации Boost не зависит от того, что происходит после того, как объект превращается в его сериализованную форму. Он делает это, используя входные и выходные потоки. Файлы - это только fostream/fistream. Однако для других типов потоков порядок/шаблон, о которых вы говорите, не имеет смысла. Представьте, что вы отправляете сериализованные объекты по сети - библиотека не может знать, что ей придется переупорядочить порядок объектов и, по сути, она не сможет это сделать после их отправки. По этой причине он не поддерживает то, что вы ищете.

Что вы можете сделать, это создать оболочку, которая либо просто кэширует сериализованные версии объектов, либо упорядочивает их в памяти, прежде чем вы сообщите ей, чтобы они записывали их в файл, или это знает, что, поскольку вы работаете с файлами, он может позже tellg в соответствующее место в файле и добавить (этот подход потребует, чтобы вы сохранили местоположения объектов, которые вы написали в файле).

Что касается второй вещи - чтение случайного доступа к файлам. Вам нужно будет точно знать, где находится объект в памяти. Если вы знаете, что структура вашего файла не изменится, вы можете seekg по файловому потоку, прежде чем передавать его для увеличения десериализации. Если структура файла изменится, вам все равно нужно знать расположение объектов в файле. Если вы не хотите анализировать файл, чтобы найти его, вам придется его хранить где-то во время сериализации. Например, вы можете сохранить своего рода реестр объектов в верхней части файла. Вам все равно придется разбирать его, но это должно быть просто простая вещь [Object identifier]-[location in file].

+0

здесь не задействована сеть, я просто хочу быть свободной, чтобы вызывать функцию сохранения и загрузки для сериализации в любом месте кода без проверки предыдущей де-сериализации или без результатов кэширования. Эти усилия направлены на то, чтобы мой код был чистым, а бизнес-логика была простой, если бы я мог это сделать. Это было бы идеальным решением для меня, и я действительно смогу эффективно использовать свои сериализованные файлы в специальном формате. – user1802174

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^