boost :: Serialize VS std :: fstream - PullRequest
       33

boost :: Serialize VS std :: fstream

2 голосов
/ 01 августа 2011

Привет, я думаю, что я немного запутался с целью повышения :: serialize:

Необходимость добавить функцию boost :: serialize к каждому классу, который вы планируете сохранить, похоже, в некоторой степени опровергает цель библиотеки, поскольку вместо повышение / уменьшение времени разработки, похоже, добавит ОГРОМНОЕ количество времени с тех пор, как вам нужно войти и редактировать источник каждого класса в каждой используемой вами библиотеке, чтобы он имел функцию сериализации.

Я планировал использовать его для игры SFML / Box2D, но теперь у меня возникают мысли, как только я обдумываю это ... Я неправильно использую библиотеку?

Кажется, что std :: fstream была бы гораздо лучшей идеей , так как для этого не требуется вносить какие-либо функции или изменения в какой-либо класс, который вы хотите сохранить, и я мог бы создать " Сохранить класс . "

Ответы [ 3 ]

6 голосов
/ 01 августа 2011

Э, что? Boost.Serialization не является заменой для потоков ввода-вывода. Это основа для сериализации (то есть сохранения и восстановления состояния объекта из внешнего хранилища), архивы все еще оборачивают некоторый поток для фактического чтения и записи данных. Конечно, вам нужно написать сериализованные функции, у библиотеки нет возможности узнать, где данные или как они должны быть размещены в архиве, в противном случае - если вы используете fstream, что бы это ни значило в этом контексте, вы ' Я все еще должен сделать то же самое. Вам также не обязательно реализовывать функции сохранения / загрузки в качестве членов класса - в документации сказано, как сделать их свободными функциями.

2 голосов
/ 01 августа 2011

Запись непосредственно в стандартный поток по-прежнему требует записи пары функций сериализации / десериализации. Не только компонент iostream стандартной библиотеки не поддерживает ввод-вывод пользовательских классов, но и просто запись и чтение байтов sizeof (yourObject) не сработает. Подумайте, что бы произошло, если бы в вашем классе содержались члены-указатели.

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

0 голосов
/ 01 августа 2011

Кажется, что std :: fstream будет гораздо лучшей идеей, поскольку для этого не требуется вносить какие-либо функции или изменения в какой-либо класс, который вы хотите сохранить, и я мог бы создать «Класс сохранения».

Лучше сделать что?

Сериализация обычно используется для сохранения и восстановления состояния объектов, а не произвольных данных. Его цель состоит в том, чтобы иметь возможность взять пакет объектов и создать файл, чтобы эти объекты можно было автоматически восстановить из этого файла на более позднем этапе.

Если вы можете собрать всю информацию, которую хотите сохранить, в «класс сохранения», то вам не потребуется сериализация.

Кроме того, вы не можете просто записать класс в поток; вам нужно будет реализовать перегрузку operator<< или какую-либо другую функцию, чтобы сохранить данные и загрузить их обратно. Да, вы можете просто выбросить кусочки объекта с помощью memcpy, но это не совсем безопасно. И под «не совсем безопасным» я подразумеваю «вы никогда не должны этого делать, если вы действительно, действительно не знаете, что делаете».

...