1. ホーム
  2. c++

[解決済み] 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