• 検索結果がありません。

とても使いやすい Boost の serialization

N/A
N/A
Protected

Academic year: 2021

シェア "とても使いやすい Boost の serialization"

Copied!
16
0
0

読み込み中.... (全文を見る)

全文

(1)

わんくま同盟 福岡勉強会

#09

とても使いやすい

Boost の serialization

(2)

わんくま同盟 福岡勉強会

#09

シリアライズ

(直列化)

• シリアライズ(直列化)とは何か?

– オブジェクトデータをバイト列やXMLフォーマットに

変換すること。

• もう少しわかりやすく表現すると

– オブジェクトの状態を表す変数(フィールド)とオブ

ジェクトの種類を表す何らかの識別子をファイル

化出来るようなバイト列・

XMLフォーマット形式で

書き出す事を言う。

(3)

わんくま同盟 福岡勉強会

#09

シリアライズ

(直列化)とは何か?

• 何に使う

– オブジェクトの表すデータを、ファイルとしてセーブ

したり、ネットワークで送信したりする事が出来る

ようになる。

– 作成されたバイト列やXMLフォーマットは、直列

化復元

(デシリアライズ)によって、元のオブジェク

トに復元できる。

(4)

わんくま同盟 福岡勉強会

#09

C#でのXMLのシリアライズ

• public class SampleData // シリアライズするデータ • {

• public int no;

• public string name; • public string nickName; • public bool bentouFlg; • public bool shinbokuFlg; • }

• static void Main(string[] args) { • var sd = new SampleData() { • no = 1, • name = "清水政宏", • nickName = "zegrahm", • bentouFlg = false, • shinbokuFlg = true • }; • DataSave(sd); • }

• static void DataSave(SampleData sd) {

• var serializer = new XmlSerializer(typeof(SampleData));

• using (var fs = new FileStream("SampleData.xml", FileMode.Create)) { • serializer.Serialize(fs, sd);

• } • }

(5)

わんくま同盟 福岡勉強会

#09

C#でのXMLのデシリアライズ

static void Main(string[] args) {

SampleData sd;

DataLoad(out sd);

Console.WriteLine("no: {0}", sd.no);

Console.WriteLine("name: {0}", sd.name);

Console.WriteLine("nickName: {0}", sd.nickName);

Console.WriteLine("bentouFlg: {0}", sd.bentouFlg ? "弁当あり" : "弁当なし

");

Console.WriteLine("shinbokuFlg: {0}", sd.shinbokuFlg ? "親睦会参加" : "親

睦会不参加

");

}

static void DataLoad(out SampleData sd) {

var serializer = new XmlSerializer(typeof(SampleData));

using (var fs = new FileStream("SampleData.xml", FileMode.Open)) {

sd = (SampleData)serializer.Deserialize(fs);

}

(6)

わんくま同盟 福岡勉強会

#09

作成した

XML

• <?xml version="1.0"?>

• <SampleData

xmlns:xsi="http://www.w3.org/2001/XMLSchema

-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchem

a">

<no>1</no>

<name>清水政宏</name>

<nickName>zegrahm</nickName>

<bentouFlg>false</bentouFlg>

<shinbokuFlg>true</shinbokuFlg>

• </SampleData>

(7)

わんくま同盟 福岡勉強会

#09

C#やJavaでシリアライズ・デシリアライズについて

• C#やJavaでは、実行中のでデータクラスにど

のようなフィールド変数が有り、どのようなメソ

ッドが存在するか分かる機能

(リフレクション)

が存在する。

(8)

わんくま同盟 福岡勉強会

#09

C++では

• C++では、リフレクション機能が存在しないた

め、通常なら出来ない。

• しかし、MFCやBoostライブラリには、シリアラ

イズを行うためのクラスが用意されている。

• ただし、C++では、リフレクションが存在しない

ため、シリアライズを行う処理自体をコードで

記述する必要がある。

(9)

わんくま同盟 福岡勉強会

#09

MFCでの例(対象クラスの定義 -ヘッダー)

• // ヘッダー

• class SampleData : public CObject

• {

DECLARE_SERIAL(SampleData)

• public:

SampleData();

virtual ~SampleData();

virtual void Serialize(CArchive& archive);

int no;

CString name;

CString nick_name;

bool bentou_flg;

bool shinboku_flg;

• };

(10)

わんくま同盟 福岡勉強会

#09

MFCでの例(対象クラスの定義 -ソース)

• IMPLEMENT_SERIAL(SampleData, CObject, 1)

• SampleData::SampleData() {}

• SampleData::~SampleData() {}

• void SampleData::Serialize(CArchive& ar)

• {

CObject::Serialize(ar);

if (ar.IsLoading()) {

ar >> no >> name >> nick_name >>

bentou_flg >> shinboku_flg;

} else {

ar << no << name << nick_name <<

bentou_flg << shinboku_flg;

}

• }

(11)

わんくま同盟 福岡勉強会

#09

MFCのシリアライズは使えるか?

• MFCでシリアライズを行う事が出来るが、これ

では普通にセーブ・ロードしているのと、あま

りかわらない。

(12)

わんくま同盟 福岡勉強会

#09

Boostのシリアライズ(クラス定義)

• class SampleData { • public: • SampleData(); • ~SampleData(); • int no; • string name; • string nick_name; • bool bentou_flg; • bool shinbokukai_flg; • private:

• friend class boost::serialization::access; • template<class Archive>

• void serialize(Archive& ar, unsigned int ver) {

• ar & no & name & nick_name & bentou_flg & shinbokukai_flg; • }

(13)

わんくま同盟 福岡勉強会

#09

Boostシリアライズコード

• void DataSave(const SampleData& sd) { • ofstream file("SampleData.txt");

• boost::archive::text_oarchive oa(file); • oa << sd;

• }

• int main(int argc, char* argv[]) • { • SampleData sd; • sd.no = 1; • sd.name = "清水政宏"; • sd.nick_name = "zegrahm"; • sd.bentou_flg = false; • sd.shinbokukai_flg = true; • DataSave(sd); • return 0; • }

(14)

わんくま同盟 福岡勉強会

#09

Boostデシリアライズ

• void DataLoad(SampleData& sd) { • ifstream file("SampleData.xml"); • boost::archive::xml_iarchive ia(file); • ia >> BOOST_SERIALIZATION_NVP(sd); • }

• int main(int argc, char* argv[]) • {

• SampleData sd; • DataLoad(sd);

• cout << "no: " << sd.no << endl;

• cout << "name: " << sd.name << endl;

• cout << "nick_name: " << sd.nick_name << endl;

• cout << "bentou_flg: " << (sd.bentou_flg ? "弁当あり" : "弁当なし") << endl;

• cout << "shinboku_flg: " << (sd.shinbokukai_flg ? "親睦会参加" : "親睦会非参加") << endl;

• return 0; • }

(15)

わんくま同盟 福岡勉強会

#09

シリアライズのまとめ1

(16)

わんくま同盟 福岡勉強会

#09

シリアライズのまとめ2

• 参考URL:

– http://hw001.gate01.com/eggplant/tcf/cpp/boo

st_serialization.html

参照

関連したドキュメント

サンプル 入力列 A、B、C、D のいずれかに指定した値「東京」が含まれている場合、「含む判定」フラグに True を

わかりやすい解説により、今言われているデジタル化の変革と

鉄道駅の適切な場所において、列車に設けられる車いすスペース(車いす使用者の

   遠くに住んでいる、家に入られることに抵抗感があるなどの 療養中の子どもへの直接支援の難しさを、 IT という手段を使えば

と判示している︒更に︑最後に︑﹁本件が同法の範囲内にないとすれば︑

環境づくり ① エコやまちづくりの担い手がエコを考え、行動するための場づくり 環境づくり ②

フェイスブックによる広報と発信力の強化を図りボランティアとの連携した事業や人材ネ

現在の化石壁の表面にはほとんど 見ることはできませんが、かつては 桑島化石壁から植物化石に加えて 立 木の 珪 化