Внутреннее хранилище классов и структур - PullRequest
0 голосов
/ 24 января 2012

Я хочу использовать указатель magikry для сохранения класса C ++, используя следующий метод, который записывает байтовые данные в файл:

result Osp::Io::File::Write (const void *buffer, int length);
  • Параметры:

    • buffer - Указатель на предоставленный пользователем буфер, который содержит байтовые данные для записи
    • length - длина буфера в байтах
  • Исключения:

    • E_SUCCESS - метод успешен.
    • E_INVALID_STATE - Файл еще не открыт.
    • E_ILLEGAL_ACCESS - Файл не открыт для операции записи или доступ запрещен из-за недостаточных прав доступа.
    • E_INVALID_ARG - Произошло одно из следующих условий:
      • Указанный буфер содержит нулевой указатель.
      • Указанная длина буфера равна или меньше 0.
      • Неверный дескриптор файла (либо файл закрыт другим способом, либо память повреждена).
    • E_STORAGE_FULL - Дисковое пространство заполнено.
    • E_IO - неожиданный сбой устройства произошел из-за внезапного извлечения носителя или обнаружения повреждения файла.

Я бы предпочел не предполагать, что будет какая-либо буферизация, хотя я уверен, что каждый байт не повлечет за собой переписывание целого блока флеш-памяти, но мне было интересно, есть ли лучший способ записать все поля данных класса (и ничего больше, например, статические поля), например, указателем на объект (*this)?

1 Ответ

2 голосов
/ 24 января 2012

В C ++ вы не записываете «сырые» объекты в файлы, а сериализуете их.В этом нет никакой магии, вам нужно написать свой код сериализации самостоятельно (для удобства перегрузка операторов << и >>).

Вы можете сделать это в старом стиле C, просто выгрузив память, но в дополнениек проблемам, которые это обычно вызывает в C (выравнивание, порядковые номера при передаче данных между системами), вы также получаете проблемы, представленные C ++ (внутреннее представление класса, возможные «скрытые» члены данных, такие как v-таблица и т. д.).

Если вы хотите гарантировать, что вы читаете и записываете надежные данные, которые могут быть переданы между различными системами и / или различными частями программного обеспечения - вам лучше реализовать сериализацию, а не искать ярлыки.

Для этого вы можете использовать библиотеки типа Boost.Serialization .

...