boost如何序列化 和反序列化 指针类(本身类也可以)

今天找了很长时间如何序列化和反序列化自己类,但是找了很多帖子都没有序列化自己指针类的例子。最后我发现boost对于指针的序列化和反序列化处理不好。于是我自己想办法解决如何序列化指针类。序列化指针类的真正原理都是直接序列化数据本身。把指针转换成数值。不多说了 直接上代码,希望能帮助其他朋友

class FPDF_BOOKMARKNODE {
public:


FPDF_BOOKMARKNODE() :firstChild(nullptr), nextSibling(nullptr)  {}
FPDF_BOOKMARKNODE(const std::wstring &title, const int &ipage) :wtitle(title), page(ipage),
firstChild(nullptr), nextSibling(nullptr) {}




FPDF_BOOKMARKNODE(FPDF_BOOKMARKNODE &&other) : wtitle(other.wtitle), page(other.page), firstChild(std::move(other.firstChild)),
nextSibling(std::move(other.nextSibling)) {
}


FPDF_BOOKMARKNODE &operator=(FPDF_BOOKMARKNODE*rhs) {
if (this != rhs) {
wtitle = rhs->wtitle;
page = rhs->page;
firstChild = std::move(rhs->firstChild);
nextSibling = std::move(rhs->nextSibling);
rhs->firstChild = rhs->nextSibling = nullptr;
}
return *this;
}


~FPDF_BOOKMARKNODE() {}


inline bool isHaveChile()  { return firstChild == nullptr; }
inline bool isHaveNext()  { return nextSibling == nullptr; }
inline FPDF_BOOKMARKNODE *Child()   { return firstChild; }
inline FPDF_BOOKMARKNODE *Sibling()  { return nextSibling; }

//其实这就是要序列化和反序列化的4个值
std::wstring  wtitle;
int page;
FPDF_BOOKMARKNODE *firstChild;
FPDF_BOOKMARKNODE *nextSibling;
private:


friend class boost::serialization::access;

//因为我的类内部有自己的指针 所以递归调用
template<typename Archive>
void tosave(Archive& ar) const
{
ar << BOOST_SERIALIZATION_NVP(wtitle);
ar << BOOST_SERIALIZATION_NVP(page);


bool is_null;
if (firstChild != 0) {
is_null = false;
ar << boost::serialization::make_nvp("firstChild_isnull", is_null);
firstChild->tosave(ar);
}
else
{
is_null = true;
ar << boost::serialization::make_nvp("firstChild_isnull", is_null);
}


if (nextSibling != 0) {
is_null = false;
ar << boost::serialization::make_nvp("nextSibling_isnull", is_null);
nextSibling->tosave(ar);
}
else
{
is_null = true;
ar << boost::serialization::make_nvp("nextSibling_isnull", is_null);
}
}


template<typename Archive>
void save(Archive& ar, const unsigned int version) const
{
ar << BOOST_SERIALIZATION_NVP(wtitle);
ar << BOOST_SERIALIZATION_NVP(page);


bool is_null;
if (firstChild != 0) {
is_null = false;
ar<< boost::serialization::make_nvp("firstChild_isnull", is_null);
firstChild->tosave(ar);
}
else
{
is_null = true;
ar << boost::serialization::make_nvp("firstChild_isnull", is_null);
}


if (nextSibling != 0) {
is_null = false;
ar << boost::serialization::make_nvp("nextSibling_isnull", is_null);
nextSibling->tosave(ar);
}
else
{
is_null = true;
ar << boost::serialization::make_nvp("nextSibling_isnull", is_null);
}
}
template<class Archive>
void load(Archive& ar,  const unsigned int version)

{

//反序列化我发现只能够返回递归最后一组数据 所以先new一个头指针,用于最后返回

FPDF_BOOKMARKNODE*P = new FPDF_BOOKMARKNODE;
ar >> BOOST_SERIALIZATION_NVP(P->wtitle);
ar >> BOOST_SERIALIZATION_NVP(P->page);
bool is_null;
ar >> boost::serialization::make_nvp("firstChild_isnull", is_null);
if (is_null == true) {
P->firstChild = NULL;
}
else
{
P->firstChild = new FPDF_BOOKMARKNODE;
Toload(ar, P->firstChild);
//ar& boost::serialization::make_nvp("data", *ptr.firstChild);
}
ar >> boost::serialization::make_nvp("nextSibling_isnull", is_null);
if (is_null == true) {
P->nextSibling = NULL;
}
else
{
P->nextSibling = new FPDF_BOOKMARKNODE;
Toload(ar, P->nextSibling);
//ar& boost::serialization::make_nvp("data", *ptr.nextSibling);
}


*this = *P;//把头数据返回 并删除new的指针   最后记住 返回后的指针需要你自己销毁 这里没有处理
delete P;
P = NULL;
}


template<class Archive>
void Toload(Archive& ar, FPDF_BOOKMARKNODE* bookmark)
{
ar >> BOOST_SERIALIZATION_NVP(bookmark->wtitle);
ar >> BOOST_SERIALIZATION_NVP(bookmark->page);
bool is_null;
ar >> boost::serialization::make_nvp("firstChild_isnull", is_null);
if (is_null == true) {
bookmark->firstChild = NULL;
}
else
{
bookmark->firstChild = new FPDF_BOOKMARKNODE;
Toload(ar, bookmark->firstChild);
//ar& boost::serialization::make_nvp("data", *ptr.firstChild);
}
ar >> boost::serialization::make_nvp("nextSibling_isnull", is_null);
if (is_null == true) {
bookmark->nextSibling = NULL;
}
else
{
bookmark->nextSibling = new FPDF_BOOKMARKNODE;
Toload(ar, bookmark->nextSibling);
//ar& boost::serialization::make_nvp("data", *ptr.nextSibling);
}
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
};

终于很好的解决这个问题了。希望对大家有帮助

猜你喜欢

转载自blog.csdn.net/u011569253/article/details/54316200