На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> сереализация , boost::serialization
    Подскажите пожалуйста как можно
    1. Сериализовать базовый класс
    2. Как можно серелизовать контейнер. в котором хранятся указатели. Тоесть
    2.1. Можно хранить умные указатели - тогда вроде прокатит
    2.2. Можно ли без умных указателей сереализовать голый указатель ?
      Классика жанра :)
      Сообщение отредактировано: BlackEmperor -
        BlackEmperor, что-то я не нашел там решения моих вопросов
        только лишь

        ExpandedWrap disabled
          ПРЕДУПРЕЖДЕНИЕ
          Опасно включать в карту указатели на какие-то объекты в памяти –
          если объект сохраняется или передаётся по сети на другой компьютер,
          то, скорее всего, после раскрутки буфера этот указатель будет указывать неизвестно куда,
          а это никогда не приводило ни к чему хорошему.


        Но от этого не легче :) И так было понятно что ничего не предпренимая сделать не удасться
        Сообщение отредактировано: zss -
          http://www.boost.org/libs/serialization/doc/tutorial.html
            1. C этим понятно
            ExpandedWrap disabled
              #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. А вот это
            ExpandedWrap disabled
              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(){}
              };


            и это
            ExpandedWrap disabled
              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 на это делается акцент ?
              Цитата zss @
              Получается, что он нормально их схавает ?

              Да.

              Цитата
              А почему тогда в той статье что привел
              BlackEmperor на это делается акцент ?

              Дык, ведь в той статье не про boost::serialization и говорится...
                Hryak

                вот пример тестового кода
                ExpandedWrap disabled
                  /* -------------------------------------------------------------------------- */
                  #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;
                  }
                  /* -------------------------------------------------------------------------- */


                вываливает
                ExpandedWrap disabled
                  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 ==========


                что ему нужно ?
                Сообщение отредактировано: zss -
                  Измени порядок включения хедеров:
                  ExpandedWrap disabled
                    #include <boost/archive/xml_iarchive.hpp>
                    #include <boost/archive/xml_oarchive.hpp>
                    #include <boost/serialization/base_object.hpp>
                    #include <boost/serialization/nvp.hpp>


                  и переделай сериализацию базового класса:
                  ExpandedWrap disabled
                    archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
                    Во как !!!!

                    И как же нам простым смертным все тонкости знать :)


                    Hryak не обижайся за назойливасть, но еще
                    ExpandedWrap disabled
                      /* -------------------------------------------------------------------------- */
                      #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;
                      }


                    выдает

                    ExpandedWrap disabled
                      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 ==========
                      Цитата zss @
                      Hryak не обижайся за назойливасть, но еще

                      Обижаться не буду, но буду давать уклончивые ответы. :)

                      Цитата
                      ExpandedWrap disabled
                            Some s ();

                      Вопрос на засыпку - что ты здесь такое объявил? ;)
                        Цитата Hryak @
                        Вопрос на засыпку - что ты здесь такое объявил?

                        получилась функция, возвращающая тип Some...

                        Попробовал сварить - получил
                        ExpandedWrap disabled
                          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
                          Цитата zss @
                          Но я не нашел ничего подходящего для std::pair

                          ExpandedWrap disabled
                            #include <boost/serialization/utility.hpp>
                            Hryak - ты лучший :)
                              Hryak, извини, но еще проблемка :)


                              как можно сериализовать интерфейс ? что-то не нравится ему...

                              тестовый код
                              ExpandedWrap disabled
                                /* -------------------------------------------------------------------------- */
                                #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;
                                }
                                /* -------------------------------------------------------------------------- */
                                Цитата zss @
                                что-то не нравится ему...

                                Чего не нравится? Как ругается?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0583 ]   [ 16 queries used ]   [ Generated: 3.05.24, 00:23 GMT ]