增强从结构列表派生的结构的序列化

Posted

技术标签:

【中文标题】增强从结构列表派生的结构的序列化【英文标题】:boost serialization of struct derived from struct list 【发布时间】:2014-04-22 04:38:37 【问题描述】:

我不确定如何序列化从另一个列表类型结构派生的结构。 以下是我要问的示例代码:

//Nodes.hpp

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

struct Node

      std::string firstname;
      std::string lastname;

   private:
      friend class boost::serialization::access;
      template<class Archive>
      void serialize(Archive &ar, const unsigned int version)
      
         ar & firstname;
         ar & lastname;
      

;

struct Nodes : public std::list<Node>

      std::string address;
      std::string country;

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

;

BOOST_CLASS_EXPORT_KEY(Node);
BOOST_CLASS_EXPORT_KEY(Nodes);

BOOST_CLASS_EXPORT_IMPLEMENT(Nodes);         
BOOST_CLASS_IMPLEMENTATION(Nodes,boost::serialization::object_serializable);
BOOST_CLASS_TRACKING(Nodes,boost::serialization::track_never);

请查看“public std::list”行,让我知道我的序列化是否正确。

【问题讨论】:

你能停止发布无聊的代码吗?并停止使用 MS-Word 复制/粘贴代码?发布包含非法关键字 (Struct)、重复和冗余的导出 MACRO 的代码是没有用的定义Node::~Nodes 的实现(它是什么?Node?还是Nodes?)。等等。这真的很简单。只需发布您的工作代码。如果不能,请发帖sscce.org 我会改正的.. 我已经更正了..它需要的地方.. 你这么认为? :) 我已经编辑了其他问题。请注意,与“进行更正”相比,通常更容易避免“进行不更正”(即在您最喜欢的 IDE 中准备您的 SSCCE,编译器会告诉您您错过的事情。通常,在此过程中您会已经注意到您的问题的解决方案。请参阅 Solve your problem by almost asking a question on *** 我是否需要在 .cpp 文件中也包含 BOOST_CLASS_EXPORT_IMPLEMENT(Node) ? 【参考方案1】:

我不知道你想问什么。不过我知道

    不建议从标准容器继承(它们不是为此而设计的)

    如果你这样做了,你仍然必须指定你希望基类序列化:

    struct Nodes : public std::list<Node>
    
        std::string address;
        std::string country;
    
    private:
        friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive &ar, const unsigned int version)
        
            ar & boost::serialization::base_object<std::list<Node> >(*this);
            ar & address;
            ar & country;
        
    
    ;
    

当然,我建议将list 设为member 而不是base。不要忘记包含boost/serialization/list.hpp:查看它Live On Coliru

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

struct Node

    std::string firstname;
    std::string lastname;

    private:
    friend class boost::serialization::access;
    template<class Archive>
        void serialize(Archive &ar, const unsigned int version)
        
            ar & firstname;
            ar & lastname;
        

;

struct Nodes : public std::list<Node>

    std::string address;
    std::string country;

    private:
    friend class boost::serialization::access;
    template<class Archive>
        void serialize(Archive &ar, const unsigned int version)
        
            ar & boost::serialization::base_object<std::list<Node> >(*this);
            ar & address;
            ar & country;
        

;

BOOST_CLASS_EXPORT_KEY(Node);
BOOST_CLASS_EXPORT_KEY(Nodes);

BOOST_CLASS_EXPORT_IMPLEMENT(Nodes);
BOOST_CLASS_IMPLEMENTATION(Nodes    , boost::serialization::object_serializable);
BOOST_CLASS_TRACKING(Nodes          , boost::serialization::track_never);

int main()

    boost::archive::text_oarchive oa(std::cout);
        Nodes nodes;
        nodes.address = "Mr.";
        nodes.country = "Puerto Mazarique";
        nodes.insert(nodes.end(), Node"John", "Doe");
        nodes.insert(nodes.end(), Node"Jane", "Greenwalt");
        nodes.insert(nodes.end(), Node"Morgan", "Cheese");
        nodes.insert(nodes.end(), Node"Walton", "Whiz");

        oa << nodes;

【讨论】:

我是否需要在 .cpp 文件中也包含 BOOST_CLASS_EXPORT_IMPLEMENT(Node) ? @user3382670 我不这么认为,因为你的类似乎都不是多态的。 最初我发布了错误的命名空间,因此只是试图进行更正。真的很抱歉..如果它影响您的声誉得分..这不是故意的.. @user3382670 它没有。我只是想帮助你下次更有效:)(我不会反对你affecting my reputation score,但请先看看它是否有帮助)。

以上是关于增强从结构列表派生的结构的序列化的主要内容,如果未能解决你的问题,请参考以下文章

python--数据结构序列

python数据结构详解

如何从非托管 C++ 代码获取结构化列表值到 C#?

第7天:Python 数据结构--序列

未序列化的结构列表列表。 System.RuntimeType 由于其保护级别而无法访问。只能处理公共类型

列表和元组