★16.boost--serialization

A類

A.h

#ifndef __A_H__
#define __A_H__

#include <utility>
#include <boost/serialization/utility.hpp>
#include <boost/serialization/export.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>

class A {
public:
    A(int a, int b);
    virtual ~A() = default;

private:
    std::pair<int, int> _pair;

private:
    // 打算序列化的類必須有默認(rèn)構(gòu)造函數(shù)
    A() = default;

    // 序列化所需工作
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive& ar, const unsigned int version) {
        ar & _pair;
    }
};
// 如果是抽象基類,還需要
// #include <boost/serialization/assume_abstract.hpp
// BOOST_SERIALIZATION_ASSUME_ABSTRACT(Event)
BOOST_CLASS_EXPORT_KEY(A)

#endif // __A_H__

A.cpp

#include <boost/serialization/export.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include "A.h"
BOOST_CLASS_EXPORT_IMPLEMENT(A)

A::A(int a, int b) {
    _pair = std::make_pair(a, b);
}

B類

B.h

#ifndef __B_H__
#define __B_H__

#include "A.h"
#include <vector>
#include <memory>
#include <boost/serialization/utility.hpp>
// 必須包含用到的STL容器
#include <boost/serialization/vector.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/export.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>


class B : public A {
public:
    B() : A(0, 0) {}
    B(int a, int b) : A(a, b) {}

private:
    std::vector<std::shared_ptr<A>> _vector;

private:
    // 派生序列化所需工作
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive& ar, const unsigned int version) {
        // 派生類必須先序列化基類
        ar & boost::serialization::base_object<A>(*this);
        ar & _vector;
    }
};

BOOST_CLASS_EXPORT_KEY(B)

#endif // __B_H__

B.cpp

// 派生類的實(shí)現(xiàn)文件必須寫上這些
#include <boost/serialization/export.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include "B.h"
BOOST_CLASS_EXPORT_IMPLEMENT(B)

C類

C.h

#ifndef __C_H__
#define __C_H__

#include "A.h"
#include <map>
#include <boost/serialization/utility.hpp>
// 必須包含用到的STL容器
#include <boost/serialization/map.hpp>
#include <boost/serialization/export.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>

class C : public A {
public:
    C() : A(1, 1) {}
    C(int a, int b) : A(a, b), _c(a), _d(b) {}

private:
    std::map<int, std::string> _map;
    int _c;
    int _d;

private:
    // 序列化與反序列化的分離
    friend class boost::serialization::access;

    template<class Archive>
    void save(Archive & ar, const unsigned int version) const {
        // 先save基類,注意模板參數(shù)為const A
        ar << boost::serialization::base_object<const A>(*this);
        int c = _c + 1;
        ar << c;
    }

    template<class Archive>
    void load(Archive & ar, const unsigned int version) {
        // 先load基類,注意模板參數(shù)為A
        ar >> boost::serialization::base_object<A>(*this);
        ar >> _c;
    }

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version) {
        // 告知要分開序列化與反序列化
        boost::serialization::split_member(ar, *this, version);
        // 序列化save和load行為一致的成員
        ar & _map;
        ar & _d;
    }
};

BOOST_CLASS_EXPORT_KEY(C)

#endif // __C_H__

C.cpp

// 派生類的實(shí)現(xiàn)文件必須寫上這些
#include <boost/serialization/export.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include "C.h"
BOOST_CLASS_EXPORT_IMPLEMENT(C)

main

#include <iostream>
#include <string>
#include <fstream>
#include "B.h"
#include "C.h"
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
using namespace std;

int main() {
    B b;
    C c(1, 2);

    std::ofstream ofile("file.dat");
    if (ofile.is_open()) {
        boost::archive::binary_oarchive oa(ofile);
        oa << b << c;
    }
    ofile.close();

    std::ifstream ifile("file.dat");
    if (ifile.is_open()) {
        try {
            boost::archive::binary_iarchive ia(ifile);
            ia >> b >> c;
        }
        catch (const std::exception&) {
            // 輸入流錯誤
        }
    }
    ifile.close();
    return system("pause");
}

注意點(diǎn)

  • 所有使用BOOST_CLASS_EXPORT_*的地方都要包含所使用到的archive頭文件。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,535評論 19 139
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,317評論 0 17
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,041評論 0 9
  • 全世界的旅行者通過各種方式匯集到這里,短暫停留幾日以后又分散到泰國各地。飛機(jī)平穩(wěn)地降落至清邁機(jī)場,順著熙熙攘...
    蕾兒喬什看世界閱讀 283評論 0 1

友情鏈接更多精彩內(nèi)容