微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C++ 中提升序列化向量

如何解决在 C++ 中提升序列化向量

你好,我有这两个类,我想序列化向量

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 个元素,这是正确的做法吗?

解决方法

我最怀疑的是你可能没有在阅读前完全刷新存档流。

简单的概念证明,注意注释:

Live On Coliru

#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,{ 7,{ 8,{ 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。