最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ Boost Archive超詳細(xì)講解

 更新時(shí)間:2022年12月01日 10:27:04   作者:無水先生  
Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱

一、說明

對Boost.Serialization庫的應(yīng)用,存在如下內(nèi)容:

Boost.Serialization 庫可以將 C++ 程序中的對象轉(zhuǎn)換為可以保存和加載以恢復(fù)對象的字節(jié)序列。有不同的數(shù)據(jù)格式可用于定義生成字節(jié)序列的規(guī)則。 Boost.Serialization 支持的所有格式僅適用于此庫。例如,為 Boost.Serialization 開發(fā)的 XML 格式不應(yīng)用于與不使用 Boost.Serialization 的程序交換數(shù)據(jù)。 XML 格式的唯一優(yōu)點(diǎn)是它可以使調(diào)試更容易,因?yàn)?C++ 對象以可讀格式保存。

二、關(guān)于Archive庫

Boost.Serialization 的主要概念是存檔。存檔是表示序列化 C++ 對象的字節(jié)序列??梢詫ο筇砑拥酱鏅n中以對其進(jìn)行序列化,然后再從存檔中加載。為了恢復(fù)以前保存的 C++ 對象,假定相同的類型。

示例 64.1。使用 boost::archive::text_oarchive

#include <boost/archive/text_oarchive.hpp>
#include <iostream>
using namespace boost::archive;
int main()
{
  text_oarchive oa{std::cout};
  int i = 1;
  oa << i;
}

Boost.Serialization 提供歸檔類,例如 boost::archive::text_oarchive,它在 boost/archive/text_oarchive.hpp 中定義。此類可以將對象序列化為文本流。使用 Boost 1.56.0,示例 64.1 將 22 serialization::archive 11 1 寫入標(biāo)準(zhǔn)輸出流。

可以看出,boost::archive::text_oarchive 類型的對象 oa 可以像流一樣使用 operator<< 序列化變量。但是,不應(yīng)將存檔視為存儲任意數(shù)據(jù)的常規(guī)流。要恢復(fù)數(shù)據(jù),您必須在存儲數(shù)據(jù)時(shí)訪問它,并以相同的順序使用相同的數(shù)據(jù)類型。示例 64.2 序列化并恢復(fù)一個(gè) int 類型的變量。

示例 64.2。使用 boost::archive::text_iarchive

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <iostream>
#include <fstream>
using namespace boost::archive;
void save()
{
  std::ofstream file{"archive.txt"};
  text_oarchive oa{file};
  int i = 1;
  oa << i;
}
void load()
{
  std::ifstream file{"archive.txt"};
  text_iarchive ia{file};
  int i = 0;
  ia >> i;
  std::cout << i << '\n';
}
int main()
{
  save();
  load();
}

boost::archive::text_oarchive 類將數(shù)據(jù)序列化為文本流,而 boost::archive::text_iarchive 類從此類文本流中恢復(fù)數(shù)據(jù)。要使用這些類,請包含頭文件 boost/archive/text_iarchive.hpp 和 boost/archive/text_oarchive.hpp。

檔案的構(gòu)造函數(shù)期望輸入或輸出流作為參數(shù)。流用于序列化或恢復(fù)數(shù)據(jù)。雖然示例 64.2 訪問文件,但也可以使用其他流,例如字符串流。

示例 64.3。使用字符串流序列化

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
void save()
{
  text_oarchive oa{ss};
  int i = 1;
  oa << i;
}
void load()
{
  text_iarchive ia{ss};
  int i = 0;
  ia >> i;
  std::cout << i << '\n';
}
int main()
{
  save();
  load();
}

Example 64.3

示例 64.3 使用字符串流將 1 寫入標(biāo)準(zhǔn)輸出以序列化數(shù)據(jù)。

到目前為止,只有原始類型被序列化。示例 64.4 顯示了如何序列化用戶定義類型的對象。

示例 64.4。使用成員函數(shù)序列化用戶定義的類型

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
class animal
{
public:
  animal() = default;
  animal(int legs) : legs_{legs} {}
  int legs() const { return legs_; }
private:
  friend class boost::serialization::access;
  template <typename Archive>
  void serialize(Archive &ar, const unsigned int version) { ar & legs_; }
  int legs_;
};
void save()
{
  text_oarchive oa{ss};
  animal a{4};
  oa << a;
}
void load()
{
  text_iarchive ia{ss};
  animal a;
  ia >> a;
  std::cout << a.legs() << '\n';
}
int main()
{
  save();
  load();
}

為了序列化用戶定義類型的對象,您必須定義成員函數(shù) serialize()。當(dāng)對象被序列化為字節(jié)流或從字節(jié)流恢復(fù)時(shí)調(diào)用此函數(shù)。因?yàn)?serialize() 用于序列化和恢復(fù),所以除了 operator<< 和 operator>> 之外,Boost.Serialization 還支持運(yùn)算符 operator&。使用 operator& 時(shí),無需在 serialize() 中區(qū)分序列化和恢復(fù)。

序列化或恢復(fù)對象時(shí),會自動調(diào)用 serialize()。它永遠(yuǎn)不應(yīng)該被顯式調(diào)用,因此應(yīng)該被聲明為私有的。如果聲明為私有,則必須將類 boost::serialization::access 聲明為友元,以允許 Boost.Serialization 訪問成員函數(shù)。

可能存在不允許修改現(xiàn)有類以添加 serialize() 的情況。例如,標(biāo)準(zhǔn)庫中的類就是如此。

示例 64.5。使用獨(dú)立函數(shù)序列化

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
struct animal
{
  int legs_;
  animal() = default;
  animal(int legs) : legs_{legs} {}
  int legs() const { return legs_; }
};
template <typename Archive>
void serialize(Archive &ar, animal &a, const unsigned int version)
{
  ar & a.legs_;
}
void save()
{
  text_oarchive oa{ss};
  animal a{4};
  oa << a;
}
void load()
{
  text_iarchive ia{ss};
  animal a;
  ia >> a;
  std::cout << a.legs() << '\n';
}
int main()
{
  save();
  load();
}

為了序列化不能修改的類型,可以定義獨(dú)立函數(shù) serialize(),如示例 64.5 所示。此函數(shù)需要對相應(yīng)類型的對象的引用作為其第二個(gè)參數(shù)。

將 serialize() 作為獨(dú)立函數(shù)實(shí)現(xiàn)需要可以從外部訪問類的基本成員變量。在示例 64.5 中,serialize() 只能作為獨(dú)立函數(shù)實(shí)現(xiàn),因?yàn)?legs_ 不再是動物類的私有成員變量。

Boost.Serialization 為標(biāo)準(zhǔn)庫中的許多類提供了 serialize() 函數(shù)。要序列化基于標(biāo)準(zhǔn)類的對象,需要包含額外的頭文件。

示例 64.6。序列化字符串

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/string.hpp>
#include <iostream>
#include <sstream>
#include <string>
#include <utility>
using namespace boost::archive;
std::stringstream ss;
class animal
{
public:
  animal() = default;
  animal(int legs, std::string name) :
    legs_{legs}, name_{std::move(name)} {}
  int legs() const { return legs_; }
  const std::string &name() const { return name_; }
private:
  friend class boost::serialization::access;
  template <typename Archive>
  friend void serialize(Archive &ar, animal &a, const unsigned int version);
  int legs_;
  std::string name_;
};
template <typename Archive>
void serialize(Archive &ar, animal &a, const unsigned int version)
{
  ar & a.legs_;
  ar & a.name_;
}
void save()
{
  text_oarchive oa{ss};
  animal a{4, "cat"};
  oa << a;
}
void load()
{
  text_iarchive ia{ss};
  animal a;
  ia >> a;
  std::cout << a.legs() << '\n';
  std::cout << a.name() << '\n';
}
int main()
{
  save();
  load();
}

Example 64.6

示例 64.6 通過添加 name_ 擴(kuò)展類 animal,這是一個(gè) std::string 類型的成員變量。為了序列化此成員變量,必須包含頭文件 boost/serialization/string.hpp 以提供適當(dāng)?shù)莫?dú)立函數(shù) serialize()。

如前所述,Boost.Serialization 為標(biāo)準(zhǔn)庫中的許多類定義了 serialize() 函數(shù)。這些函數(shù)在頭文件中定義,這些頭文件的名稱與標(biāo)準(zhǔn)中相應(yīng)的頭文件相同。因此,要序列化 ??std::string 類型的對象,請包含頭文件 boost/serialization/string.hpp,要序列化 ??std::vector 類型的對象,請包含頭文件 boost/serialization/vector.hpp。要包含哪個(gè)頭文件是相當(dāng)明顯的。

到目前為止被忽略的 serialize() 的一個(gè)參數(shù)是版本。此參數(shù)有助于使存檔向后兼容。示例 64.7 可以加載由示例 64.5 創(chuàng)建的存檔。示例 64.5 中動物類的版本不包含名稱。示例 64.7 在加載存檔時(shí)檢查版本號,并且僅在版本大于 0 時(shí)才訪問名稱。這允許它處理創(chuàng)建時(shí)沒有名稱的舊存檔。

示例 64.7。與版本號的向后兼容性

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/string.hpp>
#include <iostream>
#include <sstream>
#include <string>
#include <utility>
using namespace boost::archive;
std::stringstream ss;
class animal
{
public:
  animal() = default;
  animal(int legs, std::string name) :
    legs_{legs}, name_{std::move(name)} {}
  int legs() const { return legs_; }
  const std::string &name() const { return name_; }
private:
  friend class boost::serialization::access;
  template <typename Archive>
  friend void serialize(Archive &ar, animal &a, const unsigned int version);
  int legs_;
  std::string name_;
};
template <typename Archive>
void serialize(Archive &ar, animal &a, const unsigned int version)
{
  ar & a.legs_;
  if (version > 0)
    ar & a.name_;
}
BOOST_CLASS_VERSION(animal, 1)
void save()
{
  text_oarchive oa{ss};
  animal a{4, "cat"};
  oa << a;
}
void load()
{
  text_iarchive ia{ss};
  animal a;
  ia >> a;
  std::cout << a.legs() << '\n';
  std::cout << a.name() << '\n';
}
int main()
{
  save();
  load();
}

宏 BOOST_CLASS_VERSION 為類分配版本號。示例 64.7 中類動物的版本號為 1。如果未使用 BOOST_CLASS_VERSION,版本號默認(rèn)為 0。

版本號存儲在存檔中并且是其中的一部分。雖然在序列化期間使用通過 BOOST_CLASS_VERSION 宏為特定類指定的版本號,但在恢復(fù)時(shí)將 serialize() 的參數(shù)版本設(shè)置為存儲在存檔中的值。如果新版本的 animal 訪問包含用舊版本序列化的對象的存檔,則成員變量 name_ 不會被恢復(fù),因?yàn)榕f版本沒有這樣的成員變量。

  • 練習(xí)

創(chuàng)建一個(gè)程序,將 std::runtime_error 類型的對象序列化為一個(gè)文件并再次加載它。

到此這篇關(guān)于C++ Boost Archive超詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++ Boost Archive內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中string的模擬實(shí)現(xiàn)

    C++中string的模擬實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了C++中string的模擬實(shí)現(xiàn),感興趣的小伙伴們可以參考一下
    2016-08-08
  • C語言動態(tài)鏈表實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    C語言動態(tài)鏈表實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言動態(tài)鏈表實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • OpenCV + MFC實(shí)現(xiàn)簡單人臉識別

    OpenCV + MFC實(shí)現(xiàn)簡單人臉識別

    這篇文章主要為大家詳細(xì)介紹了OpenCV + MFC實(shí)現(xiàn)簡單人臉識別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • C++模擬Linux Shell編寫一個(gè)自定義命令

    C++模擬Linux Shell編寫一個(gè)自定義命令

    這篇文章主要介紹了C++如何模擬Linux Shell實(shí)現(xiàn)編寫一個(gè)自定義命令,本文通過實(shí)例代碼進(jìn)行命令行解析,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • C++類和對象實(shí)戰(zhàn)之Date類的實(shí)現(xiàn)方法

    C++類和對象實(shí)戰(zhàn)之Date類的實(shí)現(xiàn)方法

    C++ 標(biāo)準(zhǔn)庫沒有提供所謂的日期類型,C++ 繼承了C語言用于日期和時(shí)間操作的結(jié)構(gòu)和函數(shù),這篇文章主要給大家介紹了C++類和對象實(shí)戰(zhàn)之Date類的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2021-12-12
  • C語言中野指針和空指針的區(qū)別

    C語言中野指針和空指針的區(qū)別

    本文主要介紹了野指針和空指針的概念、用途、原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • C語言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼

    C語言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼

    本文主要介紹了C語言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼,包括memcpy、memmove、memset和memcmp的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • C++數(shù)據(jù)封裝以及定義結(jié)構(gòu)的詳細(xì)講解

    C++數(shù)據(jù)封裝以及定義結(jié)構(gòu)的詳細(xì)講解

    這篇文章主要詳細(xì)講解了C++數(shù)據(jù)封裝以及定義結(jié)構(gòu),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • C語言版三子棋小游戲

    C語言版三子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言版三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳析

    C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳析

    這篇文章主要給大家介紹了關(guān)于C++中4種強(qiáng)制類型轉(zhuǎn)換區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

墨脱县| 宜宾市| 万宁市| 全椒县| 彭泽县| 石棉县| 中牟县| 望都县| 岳普湖县| 瑞丽市| 洛南县| 九龙县| 承德县| 大埔区| 隆德县| 五寨县| 麦盖提县| 二连浩特市| 呈贡县| 星座| 杭锦后旗| 沽源县| 仲巴县| 当涂县| 南通市| 图们市| 静宁县| 舞阳县| 宁阳县| 威海市| 河北区| 济源市| 乐陵市| 景谷| 镇巴县| 鸡西市| 塘沽区| 鸡东县| 通道| 洛川县| 秦安县|