我有一个类,我正在尝试序列化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;
}
答案 0 :(得分:4)
您的代码不仅仅有一个问题。
首先,shared_ptr并不意味着保存数组。停止这样做。
其次,序列化库不保存我所知道的C风格字符串。实施起来非常困难,而且基本上没有意义,因为你可以保存vector
或string
,这是你应该使用的。
如果您真的坚持要保留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;
};