Повысить сериализацию конца файла - PullRequest
8 голосов
/ 12 июля 2011

Я сериализую несколько объектов в двоичный архив с помощью Boost. При чтении этих объектов из binary_iarchive существует ли способ узнать, сколько объектов находится в архиве, или просто определить конец архива?

Единственный способ, который я нашел, - это использовать try-catch для обнаружения исключения потока. Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 13 июля 2011

Я могу придумать несколько подходов:

  1. Сериализация контейнеров STL в / из вашего архива (см. документация ). В архиве будет автоматически отслеживаться количество объектов в контейнерах.

  2. Сериализуйте переменную count перед сериализацией ваших объектов. Читая ваши объекты, вы заранее будете знать, сколько объектов вы ожидаете прочитать.

  3. У последнего объекта может быть специальное значение, которое действует как некий часовой, указывающий конец списка объектов. Возможно, вы могли бы добавить функцию isLast к объекту.

  4. Это не очень красиво, но вы можете иметь отдельный «индексный файл» рядом с вашим архивом, который хранит количество объектов в архиве.

  5. Используйте позицию tellp нижележащего объекта потока, чтобы определить, находитесь ли вы в конце файла:

Пример (просто эскиз, не проверен):

std::streampos archiveOffset = stream.tellg(); 
std::streampos streamEnd = stream.seekg(0, std::ios_base::end).tellg();
stream.seekg(archiveOffset);

while (stream.tellp() < streamEnd)
{
    // Deserialize objects
}

Это может не работать с архивами XML.

0 голосов
/ 24 марта 2014

Есть ли у вас все ваши объекты, когда вы начинаете сериализацию?Если нет, то вы «злоупотребляете» буст-сериализацией - она ​​не предназначена для использования таким образом.Тем не менее, я использую его таким образом, используя try catch, чтобы найти конец файла, и это работает для меня.Просто спрячьте это где-нибудь в реализации.Однако будьте осторожны, если вы используете его таким образом, вам нужно либо не сериализовать указатели, либо отключить отслеживание указателей.

Если у вас уже есть все объекты, см. Ответ Эмиля.Все они являются действительными подходами.

0 голосов
/ 31 августа 2012

вы только что прочитали байт из файла.

Если вы не достигнете конца,

зафиксируйте байт тогда.

...