繁体   English   中英

提升c ++序列化char *

[英]Boost c++ serializing a char *

我有一个类,我正在尝试序列化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>

我试图转换为字符串并以这种方式序列化它但它产生以下错误:boost :: archive :: archive_exception'what():stream error

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;
}

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

首先,shared_ptr并不意味着保存数组。 别那样做。

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

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

新代码编辑:

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

请记住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);
    }
}

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

你缺少一些关键概念。 如果使用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;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM