读写 class 个对象到二进制文件

Reading and writing class objects to binary file

我想知道当我写的时候会发生什么:

object.write((char*)&class_object, sizeof(class_object));
// or
object.read((char*)&class_object, sizeof(class_object));

根据我目前的阅读,class_object 已转换为指针。但我不知道它是如何设法将对象携带的数据转换成二进制的。二进制实际上代表什么?

我是初学者

编辑

你能解释一下当我们写上面这段代码时到底发生了什么吗?我的意思是,当我们写 (char*)*S 时实际发生了什么,说 S 是我声明的 class 的对象?

在实践中,您的代码将无法运行,并且很可能会产生 undefined behavior, at least when your class or struct is not a POD (plain old data) and contains pointers or virtual functions (so has some vtable)。

二进制文件将包含您的对象的位表示,这不是 portable to another computer, or even to another process running the same program (notably because of ASLR),除非您的对象是 POD。

另见 this answer 一个非常相似的问题。

您可能希望某些 serialization. Since disks and file accesses are a lot slower (many dozen of thousands slower) than the CPU, it is often wise to use some more portable data representation. Practically speaking, you should consider some textual representation like e.g. JSON, XML, YAML etc.... Libraries such as jsoncpp 非常易于使用,并且您需要编写一些代码将您的对象转换为某些 JSON,并从 [=33] 创建一些对象=].

还请记住,数据通常比代码更昂贵、更珍贵。关键是您经常希望新版本的程序读取一些旧数据(由以前版本的程序编写)。这可能不是微不足道的(例如,如果您在 class 中添加或更改了某些字段的类型)。

您还可以阅读 dynamic software updating. It is an interesting research subject. Be aware of databases

另请参阅 parsing techniques, notably about recursive descent parsers。它们是相关的。

想象一下,如果您将 class 转换为字符指针,class 实例只是您 RAM 中的一些内存块:

SomeClass someClassInstance;
char* data = reinterpret_cast<char*>(&someClassInstance);

它将指向您内存中的相同数据,但在您的程序中它将被视为一个字节数组。

如果你把它转换回来:

SomeClass* instance = reinterpret_cast<SomeClass*>(data);

它将再次被视为class。

因此,为了将 class 写入文件并稍后重建它,您可以将 data 写入某个大小为 sizeof(SomeClass) 的文件,然后再读取文件并将原始字节转换为 class 实例。

但是,请记住,只有当您的 class 是 POD(普通旧数据)时,您才能这样做!