[英]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风格的字符串。 它实现起来非常困难,而且基本上没有意义,因为你可以保存vector
或string
,无论如何你应该使用它。
如果你真的坚持保留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.