gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:51:49 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

只有您的类本身知道如何正确地序列化/反序列化自身,并且它也是唯一可以访问私有(private)成员的类。 一种可能的方法 是将序列化/反序列化函数添加到您的类中。您也可以(应该)将其放入基类/接口(interface)中:

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

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

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

关于c++ - 如何获取 std::ostream.write 的指针进行序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23831836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com