Неинтрузивная сериализация защищенных членов без каких-либо изменений класса [duplicate]

Это связано с обновлением версии браузера Chrome с 64.xx до 65.xx

Теперь у вас есть 2 варианта для успешного выполнения ваших тестов.

  1. Снизьте рейтинг ваш хромированный браузер в предыдущую версию и со старым хронографом, который у вас есть.
  2. Обновите версию Chromedriver до версии 2.36 с обновленным браузером Chrome. https://chromedriver.storage.googleapis.com/index.html?path=2.36 и загрузите новый хромированный рекордер.

Вариант 2 лучше.

5
задан coincoin 26 June 2015 в 12:41
поделиться

2 ответа

  1. Вы можете использовать добрых старомодных друзей: Live On Coliru
    template <typename T>
    class A {
      public:
        A(const T &id) : m_id(id) {}
      private:
        template <typename Ar, typename U> friend void boost::serialization::serialize(Ar&,A<U>&,const unsigned);
        T m_id;
    };
    
    namespace boost {
    namespace serialization {
        template <class Archive, typename T>
        void serialize(Archive &ar, A<T> &a, const unsigned int)
        {
            ar & BOOST_SERIALIZATION_NVP(a.m_id);
        }
    }
    }
    
  2. Вы можете использовать подход getRef(). Для этого не нужны никакие друзья (менее навязчивые), требующие make_nvp (потому что вы не можете использовать a.getRef() в качестве имени элемента XML. К сожалению, с ужасным способом инкапсуляции ссылки getter break. Я лично предпочел бы иметь m_id публичный, в первую очередь. Live On Coliru
    template <typename T>
    class A {
    public:
        A(const T &id) : m_id(id) {}
    
        T& getRef()             { return m_id; } 
        T const& getRef() const { return m_id; } 
    private:
        T m_id;
    };
    
    namespace boost {
    namespace serialization {
        template <class Archive, typename T>
        void serialize(Archive &ar, A<T> &a, const unsigned int)
        {
            ar & boost::serialization::make_nvp("m_id", a.getRef());
        }
    }
    }
    

    Бонусные очки:

  3. Вы можете использовать структуру стиля «pimpl». forward объявляет структуру внутри A<>:
    template <typename T>
    class A {
    public:
        struct access;
    
        A(const T &id) : m_id(id) {}
    private:
        T m_id;
    };
    
    Это менее навязчиво, чем подход getRef(), который просто полностью разрушает инкапсуляцию. Теперь вы можете скрыть частный доступ внутри этого класса:
    namespace boost {
    namespace serialization {
        template <class Archive, typename T>
        void serialize(Archive &ar, A<T> &a, const unsigned int version)
        {
            A<T>::access::serialize(ar, a, version);
        }
    }
    }
    
    Конечно, вам все равно нужно но это может быть сделано в отдельном заголовке и вообще не влияет на класс A & lt; (или любую его специализацию):
    template <typename T>
    struct A<T>::access {
        template <class Archive>
        static void serialize(Archive &ar, A<T> &a, const unsigned int) {
            ar & BOOST_SERIALIZATION_NVP(a.m_id);
        }
    };
    
    См. Live On Coliru также
11
ответ дан sehe 27 August 2018 в 05:09
поделиться

Только для дополнительной информации: Чтобы получить первое решение от работы:

Вам нужно переслать метод друзей следующим образом:

// Boost
#include <boost/serialization/access.hpp>

class ClassB;

namespace boost{
namespace serialization {
    template <typename Ar> void serialize(Ar&,ClassB&,const unsigned);
}
}

class ClassB: public ClassA{

private:
    template <typename Ar> friend void boost::serialization::serialize(Ar&,ClassA&,const unsigned);
public:
    ClassA();
    virtual ~ClassA();
};

Принял меня в то время, чтобы заставить его работать.

Cheers

1
ответ дан sayezz 27 August 2018 в 05:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: