如何获得std::ostream的指针.编写序列化

How to get the pointer of std::ostream.write for serializing

本文关键字:序列化 指针 ostream 何获得 std      更新时间:2023-10-16

我尝试在这里序列化一个对象而不使用BOOST库,为此,我使用std::ostream对象和方法如下所示:

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

我想做的是把这个流放入一个字节数组中,并将这个数组的指针发送给另一个反序列化函数。

但是我不知道如何得到这个指针,并将这个对象转换成数组,并获得指针!

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

任意类类型的序列化是一个复杂的主题。仅仅获取对象实例的基址并复制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的情况下,这将是字符缓冲区数据和/或长度。对于像int这样的POD类型,以类似于您发布的某种方式复制内存数据就足够了。

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