我希望使用运算符“<<”将序列化对象转换为二进制文件,但是 当我序列化,例如,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.
答案 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;