如何获取std :: ostream.write的指针以进行序列化

时间:2014-05-23 14:28:09

标签: c++

我尝试在不使用BOOST库的情况下序列化一个对象,为此,我使用了一个std :: ostream对象,方法是这样写的:

obj object;
  std::ostream stream;
  stream.write((char *)&object,sizeof(obj));

我想要做的是将此流放入一个byte数组中,并将该数组的指针发送到另一个反序列化函数。

但我不知道如何获取此指针并将此对象转换为数组并获取指针!

如果有人能回答我的问题那就太棒了!

1 个答案:

答案 0 :(得分:1)

任意类类型的序列化是一个复杂的主题。 足以仅获取对象实例的基址并复制sizeof(whatever)个字节。这可能适用于具有POD类型成员的非常简单的类,但可以考虑一个简单的std::string类型成员,该成员已经在对象实例的内存块之外堆积了已分配的内存。您必须按照指向各自内存位置的所有指针并将内容复制到那里,依此类推。

只有你的班级本身知道如何正确地序列化/反序列化自己,而且它也是唯一可以访问私人成员的人。 一种可能的方法是为您的类添加序列化/反序列化功能。您可以(应该)将它放入基类/接口中:

class ISerializable
{
public:
  virtual void Serialize(std::ostream& stream) const = 0;
  virtual void Deserialize(std::istream& stream) = 0;
}

从中派生可序列化的类并实现虚函数。确保序列化程序将所有成员的数据写入流或调用类类型成员的Serialize()函数。如果您有std::string成员或其他您无法修改的类型,请使用其公共接口提取所需的所有数据,以便以后还原它们。在std::string的情况下,这将是char缓冲区数据和/或长度。对于像int这样的POD类型,以与您发布的内容类似的方式复制内存数据就足够了。

请注意,在使用上述模式时,所有可序列化类都需要默认构造函数,因为您必须先创建实例,然后才能从istream实际反序列化其内容。