Внутреннее хранилище классов и структур

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

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

    • buffer — A pointer to the user-supplied buffer that contains byte data to be written
    • length — Длина буфера в байтах
  • Исключения:

    • E_SUCCESS — The method is successful.
    • E_INVALID_STATE — Файл еще не открыт.
    • E_ILLEGAL_ACCESS — Файл не открыт для операции записи или доступ запрещен из-за недостаточного разрешения.
    • E_INVALID_ARG — Either of the following conditions has occurred:
      • The specified buffer contains a null pointer.
      • Указанная длина буфера меньше или равна 0.
      • Дескриптор файла недействителен (либо файл закрыт другим способом, либо повреждена память).
    • E_STORAGE_FULL — Место на диске заполнено.
    • E_IO — Произошел непредвиденный сбой устройства из-за внезапного извлечения носителя или обнаружения повреждения файла.

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


person John    schedule 23.01.2012    source источник
comment
Итак, вы спрашиваете, есть ли в C++ встроенные механизмы сериализации для классов и структур?   -  person Cody Gray    schedule 24.01.2012
comment
Я не думаю, что операторы потоков С++ ›› мне доступны. @ Коди, да, если ты не имеешь в виду ‹‹ и ››   -  person John    schedule 24.01.2012
comment
Большинство структур С++ нельзя сериализовать побитово, вам придется использовать потоки или что-то подобное.   -  person Mooing Duck    schedule 24.01.2012
comment
Простите меня, если я полностью упустил вопрос, но не могли бы вы просто сделать Osp::Io::File::Write(&SomeObj, sizeof(SomeObj))? Надеюсь, вы просто сериализуете типы POD.   -  person Jon G.    schedule 24.01.2012
comment
@JonG. Да, я так и думал, но теперь я помню, что оставил там еще и Osp::Base::String.   -  person John    schedule 24.01.2012


Ответы (1)


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

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

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

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

person littleadv    schedule 23.01.2012
comment
Хорошо, я нашел человека, не являющегося членом POD, который в любом случае испортил бы мой план. - person John; 24.01.2012
comment
Запись необработанных объектов в файлы — это то, что вы делаете в C++, для POD это часто самое эффективное решение. Для многих других типов данных это не так, но стандартные потоковые операторы также подходят не для всех типов данных. - person leftaroundabout; 24.01.2012
comment
@leftaroundabout +1 согласен на 100% с вашим утверждением - POD отлично подходят для максимальной эффективности в C ++, блочной записи, копировании и т. Д. - person kfmfe04; 31.01.2012