Использование iostream << для сериализации пользовательских объектов - PullRequest
2 голосов
/ 10 октября 2010

Я хочу сериализовать объект в двоичный файл, используя оператор "<<", но когда я сериализую, например, поля int, я получаю символическое представление: </p>

ofstream out("file", ios::out | ios::binary);
int i=0xAA;
out << i;

И вывод:

0x31 0x37 0x30

т.е. (0xAA -> 170)

170

Если я использую функцию записи, все в порядке:

out.write((char*)&i,sizeof(int));

Выход:

0xAA 0x00 0x00 0x00

Но можно ли использовать << вместо функции записи для сериализации объекта? Как: </p>

out << obj.field1 << obj.field2; // etc.

Ответы [ 2 ]

3 голосов
/ 10 октября 2010

Для std :: ostream и производных классов оператор << является форматированной функцией вывода. write (), с другой стороны, является неформатированной функцией вывода. Так что с ostreams ответы - нет. </p>

С другой стороны, вы можете рассмотреть возможность использования Boost.Serialization , с помощью которого вы можете сериализовать в двоичные архивы, используя оператор <<. </p>

2 голосов
/ 10 октября 2010

Во-первых, предупреждение: вы знаете, что байты внутри int или чего-либо подобного зависят от вашего компилятора, компьютера и операционной системы, верно? Другие системы могут выводить байты 0x00 0x00 0x00 0xAA для вашего примера выше или что-то еще полностью. Это означает, что если вы отправите эти байты на другой компьютер и попытаетесь их прочитать, вы не обязательно вернете исходный int.

Так или иначе. Если вы просто хотите выплюнуть целые объекты, один из способов установить это - просто определить сериализацию для вашего класса (ов) и / или структуры (ов) путем перегрузки operator<<:

std::ostream& operator<<(std::ostream& out, const MyClass& obj) {
  out.write(reinterpret_cast<const char*>(&obj.field1),
            sizeof(obj.field1)); // or something better defined
  // ...
  return out;
}

ofstream out("file", ios::out | ios::binary);
out << obj1 << obj2;
...