2016-03-19 2 views
0

Предположим, что мы пишем объект в двоичном следующим образом:Выполняет ли функция записи сериализацию объекта с использованием ASCII в C++?

file.write((char*) &object, sizeof(object)) 

Пусть объект имеет личные данные члены символьных массивов и целых типов (не std::string)

Вопрос: Пишет ли функция write объекта атрибуты для ASCII? В частности, являются ли переменные частного члена объекта, написанные как ASCII? Может ли кто-нибудь точно указать, что делает эта функция?

+2

Он просто выплевывает байты. Эти байты могут соответствовать кодировке ascii. Или они этого не делают, мир не говорит ascii или указатель. Может быть, вы можете их правильно прочитать. Или нет, зависит, не отправляйте его слишком далеко. –

+1

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

+0

О, и я должен подчеркнуть, что точка, о которой написано указатель виртуальной таблицы, важна, потому что это означает, что вы никогда не сможете действительно прочитать объект, используя простой один вызов 'read' (соответствующий простому одиночному вызову' write', напишите объект). Правильная, работая сериализация непросто, используйте существующую библиотеку для ее обработки и всех сумасшедших угловых шкафов. –

ответ

3

write() записывает отдельные байты как есть. Все, что у них есть, вот что написано. Это почти конец истории.

Итак, если ваш объект содержит массив символов, который содержит текст, закодированный в ASCII, вот что он пишет. Если тот же массив символов содержит текст, который закодирован в клингоне, вы получите Klingon в своем файле и т. Д. То, что вы видите, это то, что вы получаете.

1

Если поток открыт как binary, то к данным не будут применены переводы.

Функция записи записывает атрибуты объекта в ASCII?

binary режим потока говорит, что нет конверсий. Что в памяти написано непосредственно в потоке, никаких изменений.

В частности, являются ли переменные частного члена объекта, написанные как ASCII?

Весь объект написан независимо от сферы действия (общедоступный, закрытый или защищенный). Код не записывается в поток.

Может ли кто-нибудь точно указать, что делает эта функция?

Точно: функция записывает заданное количество значений в памяти по заданному адресу в поток.

Таким образом, все данные объекта (включая заполнение) будут записаны в поток, соответствующий данным в памяти.

1

Вы можете сохранить двоичное представление вашего объекта при двух условиях:

  • is_trivial<decltype(object)>::value является истинным
  • файловый поток Открывший в режиме ios::binary

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

write() будет записывать все содержимое объекта в виде двоичных данных. Если данные ascii, они будут записаны в ascii, но преобразование не будет выполнено.Если вы хотите написать ascii, вам нужно написать запись стандартным устройством для вставки потока. <<

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