繁体   English   中英

读写类对象到二进制文件

[英]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是我声明的类的对象时,实际上发生了什么?

实际上,至少在您的classstruct不是POD (普通旧数据)并且包含指针或虚函数(因此具有某些vtable )的情况下,您的代码将无法工作并且可能会产生未定义的行为

二进制文件将包含对象的位表示,并且除非您的对象是POD,否则它不能移植到另一台计算机,甚至不能移植到运行同一程序的另一个进程(特别是由于ASLR )。

另请参阅此答案是一个非常相似的问题。

您可能需要一些序列化 由于磁盘和文件访问比CPU慢很多(慢几十万),因此使用一些更可移植的数据表示通常是明智的。 实际上,您应该考虑一些文本表示形式 ,例如JSONXMLYAML等。...像jsoncpp这样的库确实非常易于使用,并且需要编写一些代码来将您的对象转换为某种JSON并创建JSON中的某些对象。

还请记住,数据通常比代码更昂贵,更宝贵。 关键是您通常希望某些旧数据(由程序的先前版本编写)会被程序的较新版本读取。 但这可能并不简单(例如,如果您在类中添加或更改了某些字段的class )。

您还可以阅读有关动态软件更新的信息 这是一个有趣的研究主题。 注意数据库

另请阅读有关解析技术的信息,尤其是有关递归下降解析器的信息 它们是相关的。

试想一下,如果将类转换为char指针,则类实例只是RAM中保留的一些内存块:

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

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

如果将其转换回:

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

它将再次被视为课程。

因此,为了将您的类写入文件并稍后对其进行重构,您可以将data写入大小为sizeof(SomeClass)某个文件中,然后读取该文件并将原始字节转换为该类实例。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM