【问题标题】:C++ Object SerializationC++ 对象序列化
【发布时间】:2012-03-25 22:36:31
【问题描述】:

我需要在 C++ 中获取对象的字节流。 我找不到不使用序列化的方法。

NodeEntry *one = new NodeEntry("mani", 34, 56.3);

ofstream rofs("result.ros", ios::binary);
rofs.write((char *)&one, sizeof(one));
rofs.close();

// now we read the file into object!!    
ifstream ifsr("result.ros", ios::binary);
NodeEntry *oner;
ifsr.read((char *)&oner, sizeof(oner));

还有其他解决方法吗?我不想通过网络发送此对象或将其存储在硬盘上。我只想在不实际创建文件的情况下获取对象 one 的字节流。

换句话说,我需要创建对象 one 的字节流并将其存储在某处(例如在 ostream 中),然后将这些字节传递给另一个方法并从这些字节重新构造对象.

如果你能给我一个提示,我将不胜感激。

【问题讨论】:

  • “字节流”是什么意思?你打算用它做什么?
  • 查看一些序列化框架,如 msgPack 或 Thrift。您在此处描述的方法不适用于字符串或复杂的数据结构。
  • @OliCharlesworth:我需要字节流来做一些计算(对于拉宾算法)。
  • @DvirVolk:但上面的代码适用于对象 one。据我所知,C++ 中的序列化不适用于向量或列表。
  • 您的代码可能意外运行,因为您在同一个进程空间中对其进行了反序列化,因此所有指针都保留在原位。但您将永远无法跨进程对其进行序列化。

标签: c++ serialization


【解决方案1】:

您确实意识到您正在写one地址,对吗?基本上你写的相当于:

NodeEntry** doublePtr = &one;
oner = *doublePtr;

如果您想编写对象的内容,您可以将 one 传递给 writesizeof(NodeEntry),但正如 Dvir Volk 所提到的,这将无法正常工作(或者至少可能不是您的方式希望它)与任何包含指针的东西。

无论如何,我喜欢Google's Protocol Buffers 用于序列化对象。对于您的问题,这是一个更强大的解决方案。

另外,“字节流”没有意义……你是指对象的原始内存(以字节为单位)吗?

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 2019-12-16
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多