Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.237.255] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Подскажите пожалуйста как можно
1. Сериализовать базовый класс 2. Как можно серелизовать контейнер. в котором хранятся указатели. Тоесть 2.1. Можно хранить умные указатели - тогда вроде прокатит 2.2. Можно ли без умных указателей сереализовать голый указатель ? |
Сообщ.
#2
,
|
|
|
Сообщ.
#3
,
|
|
|
BlackEmperor, что-то я не нашел там решения моих вопросов
только лишь ПРЕДУПРЕЖДЕНИЕ Опасно включать в карту указатели на какие-то объекты в памяти – если объект сохраняется или передаётся по сети на другой компьютер, то, скорее всего, после раскрутки буфера этот указатель будет указывать неизвестно куда, а это никогда не приводило ни к чему хорошему. Но от этого не легче И так было понятно что ничего не предпренимая сделать не удасться |
Сообщ.
#4
,
|
|
|
http://www.boost.org/libs/serialization/doc/tutorial.html
|
Сообщ.
#5
,
|
|
|
1. C этим понятно
#include <boost/serialization/base_object.hpp> class bus_stop_corner : public bus_stop { friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int version) { // serialize base class information ar & boost::serialization::base_object<bus_stop>(*this); ar & street1; ar & street2; } std::string street1; std::string street2; virtual std::string description() const { return street1 + " and " + street2; } public: bus_stop_corner(){} bus_stop_corner(const gps_position & lat_, const gps_position & long_, const std::string & s1_, const std::string & s2_ ) : bus_stop(lat_, long_), street1(s1_), street2(s2_) {} }; 2. А вот это class bus_route { friend class boost::serialization::access; bus_stop * stops[10]; template<class Archive> void serialize(Archive & ar, const unsigned int version) { int i; for(i = 0; i < 10; ++i) ar & stops[i]; } public: bus_route(){} }; и это class bus_route { friend class boost::serialization::access; bus_stop * stops[10]; template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & stops; } public: bus_route(){} }; Получается, что он нормально их схавает ? А почему тогда в той статье что привел BlackEmperor на это делается акцент ? |
Сообщ.
#6
,
|
|
|
Цитата zss @ Получается, что он нормально их схавает ? Да. Цитата А почему тогда в той статье что привел BlackEmperor на это делается акцент ? Дык, ведь в той статье не про boost::serialization и говорится... |
Сообщ.
#7
,
|
|
|
Hryak
вот пример тестового кода /* -------------------------------------------------------------------------- */ #include "stdafx.h" #include <Windows.h> #include <iostream> #include <fstream> /* -------------------------------------------------------------------------- */ #ifdef _MSC_VER # pragma warning (push) # pragma warning (disable : 4267) #endif #include <boost/serialization/base_object.hpp> #include <boost/serialization/nvp.hpp> #include <boost/archive/xml_iarchive.hpp> #include <boost/archive/xml_oarchive.hpp> #ifdef _MSC_VER # pragma warning (pop) #endif /* -------------------------------------------------------------------------- */ class Base : private boost::noncopyable { private : int a; friend class boost::serialization::access; template <class Archive> void serialize (Archive& archive, const unsigned int version) { archive & BOOST_SERIALIZATION_NVP (a); } protected : virtual int OnGet (void) const { return a; } public : Base () : a (0) {;} explicit Base (int a) : a(a) {;} virtual ~Base () {;} int getA (void) const { return OnGet(); } }; /* -------------------------------------------------------------------------- */ class Some : public Base { private : int s; friend class boost::serialization::access; template <class Archive> void serialize (Archive& archive, const unsigned int version) { archive & boost::serialization::base_object<Base> (*this); archive & BOOST_SERIALIZATION_NVP (s); } protected : virtual int OnGet (void) const { return Base::OnGet() + 1; } public : Some () : Base (0), s(0) {;} Some (int a, int s) : Base (a), s(s) {;} virtual ~Some () {;} int getS (void) const { return s; } }; /* -------------------------------------------------------------------------- */ int _tmain(int argc, _TCHAR* argv[]) { Some s (1, 2); std::ifstream ostream ("xxx.xml"); if (ostream.is_open()) { boost::archive::xml_iarchive archive (ostream); archive >> BOOST_SERIALIZATION_NVP (s); } ostream.close(); Sleep (1000); std::ofstream istream ("xxx.xml"); if (istream.is_open()) { boost::archive::xml_oarchive archive (istream); archive << BOOST_SERIALIZATION_NVP (s); } istream.close(); return 0; } /* -------------------------------------------------------------------------- */ вываливает Compiling... serialyze.cpp c:\boost\boost\archive\detail\oserializer.hpp(131) : error C2027: use of undefined type 'boost::serialization::extended_type_info_null<T>' with [ T=Some ] c:\boost\boost\archive\detail\oserializer.hpp(128) : while compiling class template member function 'bool boost::archive::detail::oserializer<Archive,T>::is_polymorphic(void) const' with [ Archive=boost::archive::xml_oarchive, T=Some ] c:\boost\boost\archive\detail\oserializer.hpp(264) : see reference to class template instantiation 'boost::archive::detail::oserializer<Archive,T>' being compiled with [ Archive=boost::archive::xml_oarchive, T=Some ] c:\boost\boost\archive\detail\oserializer.hpp(263) : while compiling class template member function 'void boost::archive::detail::save_non_pointer_type<Archive,T>::save_standard::invoke(Archive &,const T &)' with [ Archive=boost::archive::xml_oarchive, T=Some ] c:\boost\boost\archive\detail\oserializer.hpp(322) : see reference to class template instantiation 'boost::archive::detail::save_non_pointer_type<Archive,T>::save_standard' being compiled with [ Archive=boost::archive::xml_oarchive, T=Some ] c:\boost\boost\archive\detail\oserializer.hpp(310) : while compiling class template member function 'void boost::archive::detail::save_non_pointer_type<Archive,T>::invoke(Archive &,const T &)' with [ Archive=boost::archive::xml_oarchive, T=Some ] c:\boost\boost\archive\detail\oserializer.hpp(536) : see reference to class template instantiation 'boost::archive::detail::save_non_pointer_type<Archive,T>' being compiled with [ Archive=boost::archive::xml_oarchive, T=Some ] c:\boost\boost\archive\basic_xml_oarchive.hpp(99) : see reference to function template instantiation 'void boost::archive::save<Archive,T>(Archive &,const T &)' being compiled with [ Archive=boost::archive::xml_oarchive, T=Some ] c:\boost\boost\archive\detail\interface_oarchive.hpp(78) : see reference to function template instantiation 'void boost::archive::basic_xml_oarchive<Archive>::save_override<Some>(const boost::serialization::nvp<T> &,int)' being compiled with [ Archive=boost::archive::xml_oarchive, T=Some ] c:\temp\serialyze\serialyze\serialyze.cpp(100) : see reference to function template instantiation 'Archive &boost::archive::detail::interface_oarchive<Archive>::operator <<<const boost::serialization::nvp<T>>(const boost::serialization::nvp<T> &)' being compiled with [ Archive=boost::archive::xml_oarchive, T=Some ] c:\boost\boost\archive\detail\oserializer.hpp(131) : error C2146: syntax error : missing ';' before identifier 'typex' c:\boost\boost\archive\detail\oserializer.hpp(131) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\boost\boost\archive\detail\oserializer.hpp(131) : error C2065: 'typex' : undeclared identifier Build Time 0:02 Build log was saved at "file://c:\TEMP\serialyze\serialyze\Debug\BuildLog.htm" serialyze - 4 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== что ему нужно ? |
Сообщ.
#8
,
|
|
|
Измени порядок включения хедеров:
#include <boost/archive/xml_iarchive.hpp> #include <boost/archive/xml_oarchive.hpp> #include <boost/serialization/base_object.hpp> #include <boost/serialization/nvp.hpp> и переделай сериализацию базового класса: archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base); |
Сообщ.
#9
,
|
|
|
Во как !!!!
И как же нам простым смертным все тонкости знать Hryak не обижайся за назойливасть, но еще /* -------------------------------------------------------------------------- */ #include "stdafx.h" #include <Windows.h> #include <iostream> #include <fstream> #include <vector> /* -------------------------------------------------------------------------- */ #ifdef _MSC_VER # pragma warning (push) # pragma warning (disable : 4267) #endif #include <boost/archive/xml_iarchive.hpp> #include <boost/archive/xml_oarchive.hpp> #include <boost/serialization/nvp.hpp> #include <boost/serialization/vector.hpp> #ifdef _MSC_VER # pragma warning (pop) #endif /* -------------------------------------------------------------------------- */ class Base : private boost::noncopyable { private : typedef std::vector<std::pair<int, int> > VecType; VecType m_vec; friend class boost::serialization::access; template <class Archive> void serialize (Archive& archive, const unsigned int version) { archive & BOOST_SERIALIZATION_NVP (m_vec); } public : Base () {;} ~Base () {;} }; /* -------------------------------------------------------------------------- */ class Some { private : typedef std::vector <std::pair<int, Base *> > VecType; VecType m_vec; friend class boost::serialization::access; template <class Archive> void serialize (Archive& archive, const unsigned int version) { archive & BOOST_SERIALIZATION_NVP (m_vec); } public : Some () {;} ~Some () {;} }; /* -------------------------------------------------------------------------- */ int _tmain(int argc, _TCHAR* argv[]) { Some s (); std::ifstream ostream ("xxx.xml"); if (ostream.is_open()) { boost::archive::xml_iarchive archive (ostream); archive >> BOOST_SERIALIZATION_NVP (s); } ostream.close(); Sleep (1000); std::ofstream istream ("xxx.xml"); if (istream.is_open()) { boost::archive::xml_oarchive archive (istream); archive << BOOST_SERIALIZATION_NVP (s); } istream.close(); return 0; } выдает Compiling... serialyze.cpp c:\boost\boost\serialization\nvp.hpp(61) : warning C4180: qualifier applied to function type has no meaning; ignored c:\temp\serialyze\serialyze\serialyze.cpp(66) : see reference to class template instantiation 'boost::serialization::nvp<T>' being compiled with [ T=Some (void) ] c:\boost\boost\archive\detail\oserializer.hpp(567) : error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE<x>' with [ x=false ] c:\boost\boost\archive\basic_xml_oarchive.hpp(99) : see reference to function template instantiation 'void boost::archive::save<Archive,T>(Archive &,T (__cdecl &))' being compiled with [ Archive=boost::archive::xml_oarchive, T=Some (void) ] c:\boost\boost\archive\detail\interface_oarchive.hpp(78) : see reference to function template instantiation 'void boost::archive::basic_xml_oarchive<Archive>::save_override<Some(void)>(const boost::serialization::nvp<T> &,int)' being compiled with [ Archive=boost::archive::xml_oarchive, T=Some (void) ] c:\temp\serialyze\serialyze\serialyze.cpp(76) : see reference to function template instantiation 'Archive &boost::archive::detail::interface_oarchive<Archive>::operator <<<const boost::serialization::nvp<T>>(const boost::serialization::nvp<T> &)' being compiled with [ Archive=boost::archive::xml_oarchive, T=Some (void) ] c:\boost\boost\archive\detail\oserializer.hpp(568) : warning C4180: qualifier applied to function type has no meaning; ignored Build Time 0:02 Build log was saved at "file://c:\TEMP\serialyze\serialyze\Debug\BuildLog.htm" serialyze - 1 error(s), 2 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== |
Сообщ.
#10
,
|
|
|
Цитата zss @ Hryak не обижайся за назойливасть, но еще Обижаться не буду, но буду давать уклончивые ответы. Цитата Some s (); Вопрос на засыпку - что ты здесь такое объявил? |
Сообщ.
#11
,
|
|
|
Цитата Hryak @ Вопрос на засыпку - что ты здесь такое объявил? получилась функция, возвращающая тип Some... Попробовал сварить - получил c:\boost\boost\serialization\access.hpp(109) : error C2039: 'serialize' : is not a member of 'std::pair<_Ty1,_Ty2>' with [ _Ty1=int, _Ty2=Base * ] c:\boost\boost\serialization\serialization.hpp(81) : see reference to function template instantiation 'void boost::serialization::access::serialize<Archive,T>(Archive &,T &,const unsigned int)' being compiled with [ Archive=boost::archive::xml_oarchive, T=const std::pair<int,Base *> ] c:\boost\boost\serialization\serialization.hpp(140) : see reference to function template instantiation 'void boost::serialization::serialize<Archive,T>(Archive &,T &,const unsigned int)' being compiled with [ Archive=boost::archive::xml_oarchive, T=const std::pair<int,Base *> ] Добавлено я так понял, что он не знаек как сериализовать std::pair<int, Base *> Но я не нашел ничего подходящего для std::pair |
Сообщ.
#12
,
|
|
|
Цитата zss @ Но я не нашел ничего подходящего для std::pair #include <boost/serialization/utility.hpp> |
Сообщ.
#13
,
|
|
|
Hryak - ты лучший
|
Сообщ.
#14
,
|
|
|
Hryak, извини, но еще проблемка
как можно сериализовать интерфейс ? что-то не нравится ему... тестовый код /* -------------------------------------------------------------------------- */ #include "stdafx.h" #include <Windows.h> #include <iostream> #include <fstream> #include <vector> /* -------------------------------------------------------------------------- */ #ifdef _MSC_VER # pragma warning (push) # pragma warning (disable : 4267) #endif #include <boost/archive/xml_iarchive.hpp> #include <boost/archive/xml_oarchive.hpp> #include <boost/serialization/nvp.hpp> #include <boost/serialization/vector.hpp> #include <boost/serialization/utility.hpp> #ifdef _MSC_VER # pragma warning (pop) #endif /* -------------------------------------------------------------------------- */ struct IBase { virtual int get (void) const = 0; virtual ~IBase () = 0 {}; }; /* -------------------------------------------------------------------------- */ class Base : public IBase { private : typedef std::vector<std::pair<int, int> > VecType; VecType m_vec; friend class boost::serialization::access; template <class Archive> void serialize (Archive& archive, const unsigned int version) { archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP (IBase); archive & BOOST_SERIALIZATION_NVP (m_vec); } public : Base () { m_vec.push_back(std::make_pair(1, 1)); } ~Base () {;} virtual int get (void) const { return 1; } }; /* -------------------------------------------------------------------------- */ class Some { private : typedef std::vector <std::pair<int, IBase *> > VecType; VecType m_vec; friend class boost::serialization::access; template <class Archive> void serialize (Archive& archive, const unsigned int version) { archive & BOOST_SERIALIZATION_NVP (m_vec); } public : Some () { m_vec.push_back(std::make_pair (100, new Base())); } ~Some () {;} }; /* -------------------------------------------------------------------------- */ int _tmain(int argc, _TCHAR* argv[]) { Some s; std::ofstream istream ("xxx.xml"); if (istream.is_open()) { boost::archive::xml_oarchive archive (istream); archive << BOOST_SERIALIZATION_NVP (s); } istream.close(); Sleep (1000); std::ifstream ostream ("xxx.xml"); if (ostream.is_open()) { boost::archive::xml_iarchive archive (ostream); archive >> BOOST_SERIALIZATION_NVP (s); } ostream.close(); return 0; } /* -------------------------------------------------------------------------- */ |
Сообщ.
#15
,
|
|
|
Цитата zss @ что-то не нравится ему... Чего не нравится? Как ругается? |