【问题标题】:Internal storage of Classes and Structs类和结构的内部存储
【发布时间】:2012-01-23 23:26:31
【问题描述】:

我想使用指针魔术来保存一个 C++ 类,使用以下将字节数据写入文件的方法:

result Osp::Io::File::Write (const void *buffer, int length);
  • 参数:

    • buffer — 指向用户提供的缓冲区的指针,其中包含要写入的字节数据
    • length — 缓冲区长度(以字节为单位)
  • 例外:

    • E_SUCCESS — 方法成功。
    • E_INVALID_STATE — 文件尚未打开。
    • E_ILLEGAL_ACCESS — 未打开文件进行写操作,或因权限不足而拒绝访问。
    • E_INVALID_ARG — 发生以下任一情况:
      • 指定的缓冲区包含一个空指针。
      • 指定的缓冲区长度等于或小于 0。
      • 文件句柄无效(文件被其他方法关闭,或者内存损坏)。
    • E_STORAGE_FULL — 磁盘空间已满。
    • E_IO — 由于突然弹出媒体或检测到文件损坏,发生意外的设备故障。

我不想假设会有任何类型的缓冲,虽然我相信每个字节不会导致整个闪存块被重写,但我想知道是否有更好的方法来写入所有通过例如指向对象的指针 (*this) 的类的数据字段(没有别的,例如静态字段)?

【问题讨论】:

  • 所以你问的是 C++ 是否有任何内置的类和结构序列化机制?
  • 我不认为 C++ >> 流运算符可供我使用。 @Cody,是的,只要你不是指 >
  • 大多数 C++ 结构不能按位序列化,你必须使用流或类似的。
  • 如果我完全错过了这个问题,请原谅我,但你不能只做 Osp::Io::File::Write(&SomeObj, sizeof(SomeObj)) 吗?希望您只是在序列化 POD 类型。
  • @JonG。是的,我就是这么想的,但现在我记得在里面也留下了Osp::Base::String

标签: c++ memory object-persistence


【解决方案1】:

在 C++ 中,您不会将“原始”对象写入文件,而是序列化它们。没有什么神奇的,你需要自己编写序列化代码(重载运算符<<>>,为方便起见)。

您可以通过转储内存来实现旧的 C 风格,但是除了这通常会导致 C 的问题(对齐、系统之间传输数据时的字节序问题)之外,您还会遇到 C++ 引入的问题(内部类表示,可能的“隐藏”数据成员,例如 v-table 等)。

如果您想确保读取和写入可在不同系统和/或不同软件之间传输的可靠数据 - 您最好实现序列化,不要寻找捷径。

您可以为此使用像 Boost.Serialization 这样的库。

【讨论】:

  • 好的,我找到了一个非 POD 成员,无论如何都会搞砸我的计划。
  • 将原始对象写入文件是您在 C++ 中“不”做的任何事情,对于 POD,它通常是最有效的解决方案。对于许多其他类型的数据它不是,但标准流运算符也不适用于所有类型的数据。
  • @leftaroundabout +1 100% 同意您的说法 - POD 非常适合最大限度地提高 C++ 效率、块写入、复制等...
猜你喜欢
  • 2011-06-21
  • 2012-01-20
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
相关资源
最近更新 更多