使用iostream<<序列化用户对象

时间:2010-10-10 16:52:08

标签: c++ serialization iostream

我希望使用运算符“<<”将序列化对象转换为二进制文件,但是 当我序列化,例如,int字段时,我获得了它的符号表示:

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

输出:

0x31 0x37 0x30

即。 (0xAA - > 170)

170

如果我使用写入功能,那么ok:

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

输出:

0xAA 0x00 0x00 0x00

但是我可以使用&lt;&lt;而是写函数,来序列化对象? 像:

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

2 个答案:

答案 0 :(得分:3)

对于std :: ostream和派生类,运算符&lt;&lt;是格式化的输出函数。另一方面,write()是一个未格式化的输出函数。所以对于ostreams,答案是否定的。

另一方面,您可以考虑使用Boost.Serialization,使用&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;操作

答案 1 :(得分:2)

首先,警告:你知道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;