提升c ++序列化char *

时间:2011-02-23 17:46:06

标签: c++ serialization boost

我有一个类,我正在尝试序列化shared_ptr但序列化对象的常规方法不起作用:

class Object {
public:
    Object();
    ~Object();

    shared_ptr<char>objectone;

    friend class boost::serialization::access;
    template <typename Archive>
    void serialize(Archive &ar, const unsigned int version)
    {
        ar & objectone;
    }
};

我甚至以这种方式尝试过但它仍然不起作用:

    void serialize(Archive &ar, const unsigned int version)
    {
        for (int i = 0; i < (strlen(objectone.get())); i++)
             ar & objectone.get()[i];
    }

任何想法如何处理这个?感谢。

一些额外信息:

我已经包含了两个shared_ptr头文件:

#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/shared_ptr_132.hpp>

我试图转换为字符串并以这种方式序列化它但产生以下错误: 提高::档案:: archive_exception”   what():流错误

friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive &ar, const unsigned int version)
{
    if (objectone.get()) {
        string temp(objectone.get());
        ar & temp;
    }
    ar & objectone;
}

3 个答案:

答案 0 :(得分:4)

您的代码不仅仅有一个问题。

首先,shared_ptr并不意味着保存数组。停止这样做。

其次,序列化库不保存我所知道的C风格字符串。实施起来非常困难,而且基本上没有意义,因为你可以保存vectorstring,这是你应该使用的。

如果您真的坚持要保留char*字符串,则需要将其转换为vector/string,然后保存。然后在阅读时你需要阅读vector/string返回,获取大小,分配内存,将其粘贴在...等等...指针跟踪不起作用所以如果你依赖于你那么'我必须自己实现它。玩得开心。

新代码编辑:

您正在执行一个涵盖保存和加载的功能中的保存位。它当然不能很好地加载。您需要拆分序列化。 if (Archive::is_saving)也不起作用。 boost文档说明了如何正确拆分序列化例程。

答案 1 :(得分:4)

请记住Crazy Eddie所说的shared_ptr不适合这项工作。由于您无法灵活地更改类定义,因此需要解决此问题。

boost :: serialization提供了一个包装器make_array,它接受​​一个指针并将其包装为序列化的数组。这需要在序列化之前知道数组大小。

然后您可以执行以下操作:

void serialize(Archive &ar, const unsigned int version)
{
    ar & array_size; // Figure out how to determine this (perhaps strlen(objectone.get())

    if (ar::is_loading)
    {
        objectone.reset(new char[array_size]); // allocate the array before we load it
    }

    if (objectone.get() != NULL)
    {
        ar & make_array(objectone.get(), array_size);
    }
}

该代码示例非常简陋,但传达了这一概念。

答案 2 :(得分:2)

您缺少一些关键概念。如果使用std :: string,则不再需要share_ptr。

你可以做到

class Object {
public:
    Object();
    ~Object();

    std::string name;

    template <typename Archive>
    void serialize(Archive &ar, const unsigned int version)
    {
        ar & name;
    }
};

你已经完成了。

<强>加成

根据您的要求,这是您必须做的事情

class test
{
public:

friend class boost::serialization::access;

test() 
{       
}

template<class Archive>
void save(Archive & ar, const unsigned int version) const
{
    int len = strlen(data.get());
    ar  & len;
    for (int index = 0; index < len; ++index)
        ar & data[index];       
}
template<class Archive>
void load(Archive & ar, const unsigned int version)
{
    int len = 0;
    ar  & len;
    data = boost::shared_array<char>(new char[len+1]);
    for (int index = 0; index < len; ++index)
        ar & data[index];
    data[len] = 0;
}
BOOST_SERIALIZATION_SPLIT_MEMBER()

boost::shared_array<char> data;
};