升压确实not有一个 XML 库。
Boost Serialization 不读取一般的 XML(类似)文档。它读取 XML 档案only。这意味着,您无法控制 XML。
总而言之,您可以简单地用另一个数据成员扩展该类,并且它会偶然生成非常相似的 XML 存档。也许这对你来说已经足够了:
Live On Coliru http://coliru.stacked-crooked.com/a/6a1187e3585d1779
#include <boost/archive/xml_oarchive.hpp>
class Data
{
public:
int Degrees;
int Minutes;
float Seconds;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int /*version*/){
ar & BOOST_SERIALIZATION_NVP(Degrees);
ar & BOOST_SERIALIZATION_NVP(Minutes);
ar & BOOST_SERIALIZATION_NVP(Seconds);
}
};
class Position
{
public:
// every serializable class needs a constructor
Position() {
Degrees = 0;
Minutes = 0;
Seconds = 0;
};
Position(int degrees, int minutes, float seconds){
Degrees = degrees;
Minutes = minutes;
Seconds = seconds;
};
int Degrees;
int Minutes;
float Seconds;
Data data;
Data data2;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int /*version*/){
ar & BOOST_SERIALIZATION_NVP(Degrees);
ar & BOOST_SERIALIZATION_NVP(Minutes);
ar & BOOST_SERIALIZATION_NVP(Seconds);
ar & boost::serialization::make_nvp("data", data);
ar & boost::serialization::make_nvp("data", data2);
}
};
#include <fstream>
int main() {
Position position;
position.Degrees = 1;
position.Minutes = 2;
position.Seconds = 3;
position.data = {1,2,3};
position.data2 = {4,5,6};
{
std::ofstream ofs("output.xml");
boost::archive::xml_oarchive oa(ofs);
oa << BOOST_SERIALIZATION_NVP(position);
}
}
Writes
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="14">
<position class_id="0" tracking_level="0" version="0">
<Degrees>1</Degrees>
<Minutes>2</Minutes>
<Seconds>3.000000000e+00</Seconds>
<data class_id="1" tracking_level="0" version="0">
<Degrees>1</Degrees>
<Minutes>2</Minutes>
<Seconds>3.000000000e+00</Seconds>
</data>
<data>
<Degrees>4</Degrees>
<Minutes>5</Minutes>
<Seconds>6.000000000e+00</Seconds>
</data>
</position>
</boost_serialization>
UPDATE
如果您不想控制 XML,那就更好了。只需让库做你想做的事:
Live On Coliru http://coliru.stacked-crooked.com/a/6088ece005868bbe
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/vector.hpp>
class Data
{
public:
int Degrees;
int Minutes;
float Seconds;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int /*version*/){
ar & BOOST_SERIALIZATION_NVP(Degrees);
ar & BOOST_SERIALIZATION_NVP(Minutes);
ar & BOOST_SERIALIZATION_NVP(Seconds);
}
};
class Position
{
public:
// every serializable class needs a constructor
Position() {
Degrees = 0;
Minutes = 0;
Seconds = 0;
};
Position(int degrees, int minutes, float seconds){
Degrees = degrees;
Minutes = minutes;
Seconds = seconds;
};
int Degrees;
int Minutes;
float Seconds;
std::vector<Data> data;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int /*version*/){
ar & BOOST_SERIALIZATION_NVP(Degrees);
ar & BOOST_SERIALIZATION_NVP(Minutes);
ar & BOOST_SERIALIZATION_NVP(Seconds);
ar & boost::serialization::make_nvp("data", data);
}
};
#include <fstream>
int main() {
{
Position position;
position.Degrees = 1;
position.Minutes = 2;
position.Seconds = 3;
position.data = { {1,2,3}, {4,5,6 } };
std::ofstream ofs("output.xml");
boost::archive::xml_oarchive oa(ofs);
oa << BOOST_SERIALIZATION_NVP(position);
}
{
std::ifstream ifs("output.xml");
boost::archive::xml_iarchive ia(ifs);
Position position;
ia >> BOOST_SERIALIZATION_NVP(position);
}
}
在这种情况下,XMLhappens看起来像:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="14">
<position class_id="0" tracking_level="0" version="0">
<Degrees>1</Degrees>
<Minutes>2</Minutes>
<Seconds>3.000000000e+00</Seconds>
<data class_id="1" tracking_level="0" version="0">
<count>2</count>
<item_version>0</item_version>
<item class_id="2" tracking_level="0" version="0">
<Degrees>1</Degrees>
<Minutes>2</Minutes>
<Seconds>3.000000000e+00</Seconds>
</item>
<item>
<Degrees>4</Degrees>
<Minutes>5</Minutes>
<Seconds>6.000000000e+00</Seconds>
</item>
</data>
</position>
</boost_serialization>