Требуется ли boost::serialization::base_object каждый раз, когда я выполняю наследование?

У меня есть:

  • неполиморфная (без виртуальных методов) иерархия классов;

  • базовый класс уже содержит serialize;

  • дочерние классы сериализуются напрямую;

      class A
      {
      private:
          int x;
          int y;
    
          template<typename Archive>
          void serialize(Archive& ar, const unsigned int)
          {
              ar & x & y;
          }
      };
    
      class B : public A { /* no data members*/ };
    
      class C : public A { /* no data members*/ };
    
  1. Нужна ли мне функция serialize в классах B и C? Функция serialize в B и C именно такая:

     template<typename Archive>
     void serialize(Archive& ar, const unsigned int version)
     {
         ar & boost::serialization::base_object<A>(*this);
     }
    
  2. Должен ли я ожидать каких-то заметок в документации по этому поводу?


person Dmytro Starosud    schedule 30.06.2020    source источник
comment
Вот что говорится в документации об этом boost. org/doc/libs/1_70_0/libs/serialization/doc/ . ИМО это вводит в заблуждение, потому что это только для полиморфной (виртуальные методы) иерархии классов.   -  person alfC    schedule 04.08.2020


Ответы (1)


Нет. Если вы не хотите сериализовать данные из базы, возможно, вам это не нужно.

Однако в полиморфных иерархиях он нужен хотя бы для того, чтобы сообщить архиву о зарегистрированных типах.

См. https://www.boost.org/doc/libs/1_73_0/libs/serialization/doc/serialization.html

См. здесь множество примеров: https://stackoverflow.com/a/35756430/85371

person sehe    schedule 01.07.2020
comment
Спасибо за ответ и ссылки, похоже, это сложнее, чем я думал. Пожалуйста, позвольте мне уточнить мой вопрос, чтобы просто подтвердить, что я правильно понял примеры. - person Dmytro Starosud; 01.07.2020
comment
Я изучил образцы, которые вы предоставили, и они, похоже, не касались моего дела. Таким образом, вопрос был обновлен. Не могли бы вы взглянуть еще раз? - person Dmytro Starosud; 03.07.2020
comment
Итак, нет, это не требует сериализации базового класса. (Это показывает, почему всегда требуется четкий ответ с кодом. В своем ответе я предположил, что у вас есть базовый класс / без / интересных членов, а производные классы имеют все, но да, обратное тоже происходит). - person sehe; 03.07.2020
comment
Было бы довольно легко просто попробовать это. С точки зрения правильности моя точка зрения о полиморфных типах остается в силе: тогда они вам действительно нужны. - person sehe; 03.07.2020
comment
Так должен ли я ожидать, что доктор скажет, что вам это не нужно в вашем случае? Или достаточно отсутствия противоположности? - person Dmytro Starosud; 06.07.2020
comment
Это дело вкуса. Я ожидаю, что такое заявление, как вам это не нужно, приведет к большему количеству проблем, чем нет. Кроме того, библиотека на самом деле не заявляет, что вам это нужно: она просто говорит вам, что делать для сериализации (убедитесь, что у нее есть член serialize или свободная функция, доступная и видимая через ADL) - person sehe; 06.07.2020
comment
Точно, я как раз об этом и думал. например, если у меня есть бесплатная serialize, принимающая ссылку на базовый класс, она должна просто работать, как и в любых других случаях, например. переопределение operator<<(ostream&. Благодарю вас! - person Dmytro Starosud; 06.07.2020