我尝试在不使用BOOST库的情况下序列化一个对象,为此,我使用了一个std :: ostream对象,方法是这样写的:
obj object;
std::ostream stream;
stream.write((char *)&object,sizeof(obj));
我想要做的是将此流放入一个byte数组中,并将该数组的指针发送到另一个反序列化函数。
但我不知道如何获取此指针并将此对象转换为数组并获取指针!
如果有人能回答我的问题那就太棒了!
答案 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
实际反序列化其内容。