如何使用C ++对自定义的结构变量进行xml序列化?

问题描述 投票:0回答:1

如果有这样的结构:

struct rectangle{
    double length;
    double width;
};
struct a;
a.length = 1;
a.width = 2;

我想将其序列化为这样的xml文件:

<serialization>
    <rectangle>
        <length val=1/>
        <width val=2/>
    </rectangle>
</serialization>

而且我想为更多自定义变量做类似的事情。

但是我不知道如何认识成员,因为使用模板的函数不知道模板的具体结构。

有人可以给我一些帮助吗?

c++ xml-serialization customization
1个回答
-1
投票

使用C ++ boost库查看此序列化文档:https://vorbrodt.blog/2019/03/10/serialize-data-to-xml/

这里是链接博客的代码段:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/vector.hpp>
using namespace std;
using namespace boost::archive;
using namespace boost::serialization;

struct person
{
    string name;
    int dob;
    string email;
};

using people = vector<person>;

BOOST_CLASS_VERSION(person, 1);
BOOST_CLASS_VERSION(people, 1);

template<typename Archive>
void serialize(Archive& ar, person& person, const unsigned int version)
{
    ar & BOOST_SERIALIZATION_NVP(person.name);
    ar & BOOST_SERIALIZATION_NVP(person.dob);
    ar & BOOST_SERIALIZATION_NVP(person.email);
}

int main(int argc, char** argv)
{
    person me{"Martin Vorbrodt", 19800830, "[email protected]"};
    person her{"Dorota Vorbrodt", 19810127, "[email protected]"};
    people us{me, her};
    {
        ofstream ofs("data.xml");
        xml_oarchive oa(ofs, boost::archive::no_header);
        oa << make_nvp("people", us);
    }

    people us_too{};
    {
        ifstream ifs("data.xml");
        xml_iarchive ia(ifs, boost::archive::no_header);
        ia >> make_nvp("people", us_too);
    }

    for(auto& p : us_too)
    {
        cout << "Name  : " << p.name << endl;
        cout << "DOB   : " << p.dob << endl;
        cout << "EMail : " << p.email << endl << endl;
    }

    return 1;
}

该代码创建一个包含2个人项的XML结构。

© www.soinside.com 2019 - 2024. All rights reserved.