Я согласен, странно, что Boost.Geometry не поддерживает Boost.Serialization. Наверное тяжело поддерживать все возможные комбинации параметров шаблона, а может и не заморачивались так как WKT уже есть.
По крайней мере, в случае типов контейнеров «по умолчанию» добавить такую функциональность тривиально. Приведенный ниже код реализует это и полностью функционален.
Ниже я предполагаю, что вы используете пользовательский класс (QPoint из Qt) в качестве класса точек. Код для других типов точек будет почти идентичен моему.
Во-первых, вы добавляете сериализацию для класса Point:
#include <QPoint>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/register/point.hpp>
BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(QPoint, int, cs::cartesian, x, y, setX, setY);
typedef QPoint MyPoint;
namespace boost {
namespace serialization {
template<class Archive>
void serialize(Archive & ar, MyPoint& pt, const unsigned int version) {
ar & boost::serialization::make_nvp("x", pt.rx() );
ar & boost::serialization::make_nvp("y", pt.ry() );
}
} //namespace serialization
} //namespace boost
Затем вы добавляете сериализацию для Ring и Polygon. Здесь я использую тот факт, что Ring и Polygon по сути являются std::vector(ами) точек и колец соответственно, а сериализация для std::vector встроена в Boost.Serialization.
#include <boost/serialization/vector.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/ring.hpp>
//change template flags as you are pleased but ring and polygon has to be
//in correspondence w.r.t. to "closed" and "clockwise" policies
typedef boost::geometry::model::ring<MyPoint, false, true> MyRing;
typedef boost::geometry::model::polygon<MyPoint, false, true> MyPolygon;
namespace boost {
namespace serialization {
//Default ring<MyPoint> simply inherits from std::vector<MyPoint>,
//its serialization is trivial and no implementation is needed.
//Default polygon<MyPoint> gives direct access to outer ring and the container of inner rings
template<class Archive>
void serialize(Archive & ar, MyPolygon& poly, const unsigned int version) {
ar & boost::serialization::make_nvp("outer", poly.outer());
ar & boost::serialization::make_nvp("inners", poly.inners());
}
} //namespace serialization
} //namespace boost
Вот и все, теперь вы можете использовать MyPolygon с Boost.Serialize как любой другой класс:
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
void foo_out(std::ostream & oss, const MyPolygon & poly)
{
boost::archive::xml_oarchive oa(oss);
oa & BOOST_SERIALIZATION_NVP(poly);
}
void foo_in(std::istream & iss, MyPolygon & poly)
{
boost::archive::xml_iarchive ia(iss);
ia & BOOST_SERIALIZATION_NVP(poly);
}
Наслаждаться!
person
Michael Simbirsky
schedule
17.11.2013