[解決済み] c++のブーストシリアライズベクトル
2022-02-15 18:02:16
質問
こんにちは、私はこの2つのクラスを持っていて、ベクターをシリアライズしたいのです。
class PlayerInventory
{
private:
friend class boost::serialization::access;
template <class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar &itemID &itemCount;
}
public:
int itemID;
int itemCount;
};
class player
{
private:
friend class boost::serialization::access;
template <class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar &username &password &inv;
}
public:
string username;
string password;
std::vector<PlayerInventory> inv;
};
なぜかベクトル全体をシリアライズせず、最初の2つの要素だけをシリアライズしているのですが、これは正しい方法ですか?
解決方法は?
私の最も強い疑惑は、読み込む前にアーカイブストリームを完全にフラッシュしていない可能性があることです。
単純な概念実証、コメントに注意。
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <iostream>
#include <iomanip>
class PlayerInventory {
friend class boost::serialization::access;
template <class Archive> void serialize(Archive& ar, unsigned) {
ar &itemID &itemCount;
}
public:
int itemID;
int itemCount;
};
class player {
friend class boost::serialization::access;
template <class Archive> void serialize(Archive& ar, unsigned) {
ar &username &password &inv;
}
public:
std::string username;
std::string password;
std::vector<PlayerInventory> inv;
};
#include <sstream>
int main() {
std::stringstream ss;
{
boost::archive::text_oarchive oa(ss);
player to_save;
to_save.username = "bla";
to_save.password = "blo";
to_save.inv = {
{ 1, 17 },
{ 2, 11 },
{ 3, 8800 },
{ 4, 0 },
{ 5, 1 },
{ 6, 1 },
{ 7, 1 },
{ 8, 1 },
{ 9, 42 },
};
oa << to_save;
} // <-- destructor of text_oarchive
std::cout << "Serialized stream: " << std::quoted(ss.str()) << std::endl;
player loaded;
{
boost::archive::text_iarchive ia(ss);
ia >> loaded;
}
std::cout << "Roundtrip username:" << std::quoted(loaded.username)
<< " password:" << std::quoted(loaded.password) << std::endl;
for (auto [id, count] : loaded.inv) {
std::cout << " - item " << id << " count:" << count << std::endl;
}
}
プリント
Serialized stream: "22 serialization::archive 17 0 0 3 bla 3 blo 0 0 9 0 0 0 1 17 2 11 3 8800 4 0 5 1 6 1 7 1 8 1 9 42
"
Roundtrip username:"bla" password:"blo"
- item 1 count:17
- item 2 count:11
- item 3 count:8800
- item 4 count:0
- item 5 count:1
- item 6 count:1
- item 7 count:1
- item 8 count:1
- item 9 count:42
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】構造体のベクター初期化について
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】Enterキーを押して続行する
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較