【问题标题】:boost serialization for the std::list type varaible not working增强 std::list 类型变量的序列化不起作用
【发布时间】:2014-06-07 05:20:56
【问题描述】:

我如何序列化结构中的 std::allocator 类型并作为参考,请参见下面的代码示例:

//SimpleData.hpp

#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp> 
#include <boost/serialization/optional.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/list.hpp>

namespace A
{

    struct FullData 
    {
        FullData();
        FullData(const parameter_strings & parms);

        virtual ~FullData();

        std::string country;
        int pincode;

        private :
        friend class boost::serialization::access;
        template<class Archive>
            void serialize(Archive &ar, const unsigned int version)
            {      
                ar & country;
                ar & pincode;
            } 

         typedef std::list<FullData> FullDataInfo; // what should be done to serialize this data 
    };

}

// SimpleData.cpp
#include "SimpleData.hpp" 
#include <boost/serialization/export.hpp>

namespace A
{
    FullData::FullData()
    {

    }

    FullData::~FullData()
    {

    }

    FullData::FullData(const parameter_strings & parms): detail(parms)
    {

        // impelmentation
    }

}

BOOST_CLASS_EXPORT_IMPLEMENT(A::FullData)
BOOST_CLASS_IMPLEMENTATION(A::FullData    , boost::serialization::object_serializable)
BOOST_CLASS_TRACKING(A::FullData          , boost::serialization::track_never)

我不知道如何序列化 typedef FullData::inst_list FullDataInfo;

谢谢,

【问题讨论】:

  • 上述代码中似乎缺少inst_list 的定义。请通过sscce.org 测试您的代码,以便我们能够理解您 - 编译代码(或几乎编译代码,如果您的问题是编译器错误)比远程阅读您的想法更容易理解!
  • 更新了代码..并更正了
  • 好的。现在你尝试了什么,它是如何失败的?
  • @user3382670 这有been the sixth time I have cleaned up the mess that your questions contained,大约一个月后。然而,每次你发布一个新问题时,它都会包含同样令人讨厌的错误。如果您无法使用答案中获得的信息,也许您应该考虑放弃该项目。这是我最后一次为您定义parameter_strings
  • 我们不是唯一可以编写自包含示例程序的人。您可以从收到的任何答案中复制一份。不这样做表明极度懒惰或无能。学习没关系,但如果你不能以富有成效的方式提出问题,那么你的目标就是高。 (我希望您实际上不要将未受保护的密码存储在存档中。)

标签: c++ serialization c++11 boost boost-serialization


【解决方案1】:

您只需编写代码:

int main()
{
    boost::archive::text_oarchive oa(std::cout);

    A::FullData data1({ { "key1", "value1" }, { "key2", "value2" } });
    data1.pincode = 1234;
    data1.country = "ES";
    A::FullData data2({ { "key3", "value3" }, { "key4", "value4" } });
    data2.pincode = 4321;
    data2.country = "UK";

    A::FullData::FullDataInfo list { data1, data2 };

    oa << list;
}

Live On Coliru

输出:

22 serialization::archive 10 0 0 2 0 2 ES 1234 2 UK 4321

完整代码清单

#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp> 
#include <boost/serialization/optional.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/list.hpp>

namespace A
{
    typedef std::map<std::string, std::string> parameter_strings;
    struct FullData 
    {
        FullData() : pincode(0) {}
        FullData(const parameter_strings & parms) : pincode(0), detail(parms) {}

        virtual ~FullData() {}

        std::string country;
        int pincode;

      private:
        friend class boost::serialization::access;
        template<class Archive>
            void serialize(Archive &ar, unsigned int)
            {      
                ar & country;
                ar & pincode;
            } 

         parameter_strings detail;

      public:
         typedef std::list<FullData> FullDataInfo; // what should be done to serialize this data 
    };

}

// SimpleData.cpp
#include <boost/serialization/export.hpp>

BOOST_CLASS_EXPORT_IMPLEMENT(A::FullData)
BOOST_CLASS_IMPLEMENTATION(A::FullData    , boost::serialization::object_serializable)
BOOST_CLASS_TRACKING(A::FullData          , boost::serialization::track_never)

int main()
{
    boost::archive::text_oarchive oa(std::cout);

    A::FullData data1({ { "key1", "value1" }, { "key2", "value2" } });
    data1.pincode = 1234;
    data1.country = "ES";
    A::FullData data2({ { "key3", "value3" }, { "key4", "value4" } });
    data2.pincode = 4321;
    data2.country = "UK";

    A::FullData::FullDataInfo list { data1, data2 };

    oa << list;
}

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 2014-05-30
    • 1970-01-01
    • 2010-10-31
    • 2013-01-30
    • 2020-03-10
    • 1970-01-01
    • 2013-02-20
    • 2014-06-24
    相关资源
    最近更新 更多