#include <boost/filesystem/fstream.hpp>
#include <boost/serialization/base_object.hpp>
+#include <boost/serialization/export.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/utility.hpp>
-#include <boost/serialization/export.hpp>
+#include <boost/serialization/version.hpp>
+#include <boost/serialization/vector.hpp>
#include <boost/shared_ptr.hpp>
-#include <list>
-#include <string>
-#include <vector>
#include <iostream>
// Sequence data class
};
BOOST_CLASS_EXPORT(motif);
+//! the only purpose of this class is that the shared_ptr template
+//! functions need the serialization support to be in-class.
+class seq_string : public std::string
+{
+private:
+ friend class boost::serialization::access;
+ template<class Archive>
+ void serialize(Archive& ar, const unsigned int /*version*/) {
+ //ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(std::string);
+ ar & boost::serialization::make_nvp("bases",
+ boost::serialization::base_object<std::string>(*this)
+ );
+ }
+};
+
//! sequence track for mussa.
class Sequence
{
void load_museq(boost::filesystem::path load_file_path, int seq_num);
private:
- boost::shared_ptr<const std::string> seq;
+ boost::shared_ptr<seq_string> seq;
std::string header;
std::string species;
ar & BOOST_SERIALIZATION_NVP(motif_list);
}
};
-//BOOST_CLASS_EXPORT(Sequence);
+BOOST_CLASS_EXPORT(Sequence);
#endif
seq.set_fasta_header("fasta human");
BOOST_CHECK_EQUAL( seq.get_name(), "fasta human");
}
-/*
+
BOOST_AUTO_TEST_CASE( serialize_simple )
{
std::string seq_string = "AAGGCCTT";
BOOST_CHECK_EQUAL(seq, const_seq);
oarchive << const_seq;
}
-
Sequence seq_loaded;
{
std::istringstream iss(oss.str());
BOOST_CHECK_EQUAL(seq_loaded, seq);
}
-BOOST_AUTO_TEST_CASE( serialize_xml_tree )
+// this writes out an "old" style annotated sequence
+// with annotations attached as "motifs" and "annots"
+BOOST_AUTO_TEST_CASE( serialize_xml_sequence )
{
std::string seq_string = "AAGGCCTT";
Sequence seq(seq_string);
boost::archive::xml_oarchive oarchive(oss);
const Sequence& const_seq(seq);
BOOST_CHECK_EQUAL(seq, const_seq);
- oarchive << boost::serialization::make_nvp("seq", const_seq);
+ oarchive << boost::serialization::make_nvp("root", const_seq);
}
-
Sequence seq_loaded;
{
std::istringstream iss(oss.str());
boost::archive::xml_iarchive iarchive(iss);
- iarchive >> boost::serialization::make_nvp("seq", seq_loaded);
+ iarchive >> boost::serialization::make_nvp("root", seq_loaded);
}
BOOST_CHECK_EQUAL(seq_loaded, seq);
}
-*/
+
+BOOST_AUTO_TEST_CASE( serialize_xml_two )
+{
+ std::string seq_string = "AAGGCCTT";
+ Sequence seq1(seq_string);
+ Sequence seq2(seq1);
+
+ std::ostringstream oss;
+ // allocate/deallocate serialization components
+ {
+ boost::archive::xml_oarchive oarchive(oss);
+ const Sequence& const_seq1(seq1);
+ const Sequence& const_seq2(seq2);
+ oarchive << boost::serialization::make_nvp("seq1", const_seq1);
+ oarchive << boost::serialization::make_nvp("seq2", const_seq2);
+ }
+ //std::cout << "xml: " << oss.str() << std::endl;
+ Sequence seq1_loaded;
+ Sequence seq2_loaded;
+ {
+ std::istringstream iss(oss.str());
+ boost::archive::xml_iarchive iarchive(iss);
+ iarchive >> boost::serialization::make_nvp("seq1", seq1_loaded);
+ iarchive >> boost::serialization::make_nvp("seq2", seq2_loaded);
+ }
+ BOOST_CHECK_EQUAL(seq1_loaded, seq1);
+ BOOST_CHECK_EQUAL(seq2_loaded, seq2);
+ // test if our pointers are the same
+ BOOST_CHECK_EQUAL(seq1_loaded.c_str(), seq2_loaded.c_str());
+}