如何获得std::ostream的指针.编写序列化
How to get the pointer of std::ostream.write for serializing
我尝试在这里序列化一个对象而不使用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
实际反序列化其内容。
相关文章:
- 使用指向 struc 的指针序列化结构
- 序列化和反序列化boost共享指针
- C++通过基类指针提升子类的序列化
- 如何使用带有非默认构造函数的指针来提升序列化
- C++ 从 Boost object_pool构造的指针的 Boost 二进制序列化
- 使用 boost::序列化将派生类指针序列化为向量时出现问题
- SFINAE 序列化共享指针失败
- 如何提升::序列化指针和参考
- c++ 序列化包含字符串和指向另一个对象的指针的对象
- 使用指针增强序列化
- 指针的提升序列化保存指针的十六进制值,而不是对象的内容
- Boost:当缺少类型时,如何通过基指针序列化/反序列化泛型类型集合
- 在没有包装器的情况下提高指向基元的指针的序列化
- 无法使C++提升指针序列化正常工作
- Qt-序列化一个树结构(大量指针)
- 提升序列化,类包括指针
- 指针的向量.提升序列化
- 提升:包含指针的类实例的序列化
- 如何序列化包含指向基元的指针的类
- 序列化指针本身而不是目标对象