Повысить сериализацию - смысл содержимого в .txt файле - PullRequest
0 голосов
/ 06 марта 2020

Я хотел бы сохранить объекты из родительского класса в текстовом файле, а затем иметь возможность загружать объекты. Проблема в том, что все объекты являются указателями, поэтому могут быть сохранены только адреса объектов, но не сами объекты. Код ниже компилируется, но я не уверен, что означает информация в файле .txt.

#include <iostream>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <sstream>

class Gear {
  public:
    template<typename Archive>
    void serialize(Archive& ar, unsigned int version) { ar & v; }

    void setV (const double& _v) { v = _v; }
    double getV () { return v; }

    void status () { std::cout << "v = " << v << std::endl; }

  private:
    double v;
};

class Car {
  public:
    template<typename Archive>
    void serialize(Archive& ar, unsigned int version) {
      ar & hp;
      ar & x;
    }
    void setHP (const int& _hp) { hp = _hp; }
    void setGear (Gear* _Gear) { x = _Gear; }
    void status () { std::cout << "hp = " << hp << " Gear with v = " << x->getV() << std::endl; }

  private:
    int hp;
    Gear *x;
};

int main() {
  // Define new Gear:
  Gear* g = new Gear();
  g->setV(2.5);
  g->status();

  // Expectation is Car sets up the Gear.
  Car c;
  c.setHP(80);
  c.setGear(g);
  c.status();




  std::ofstream outputStream;
  outputStream.open("Car.txt");
  boost::archive::text_oarchive outputArchive(outputStream);
  outputArchive << c;
  outputStream.close();

  Car b;
  std::ifstream inputStream;
  inputStream.open("Car.txt", std::ifstream::in);
  boost::archive::text_iarchive inputArchive(inputStream);
  inputArchive >> b;
  b.status();
  inputStream.close();
  return 0;


}

И в файле я получаю:

22 serialization::archive 10 0 0 80 1 1 0
0 2.5

Что все это значит? 2.5 имеет смысл, но другие я не уверен.

Я также использовал sstream вместо io / fstream (замените код из std :: ofstream outputStream; на inputStream.close (); с этим кодом ниже):

    std::stringstream ss;
    boost::archive::text_oarchive oa{ss};
    oa << c;

    Car b;
    boost::archive::text_iarchive ia{ss};
    ia >> b;
    b.status();

С этим кодом Я получаю (после запуска ./a.out с помощью команды g ++ -std = c ++ 11 boost_serial. cpp -lboost_serialization):

v = 2.5
hp = 80 Gear with v = 2.5
hp = 80 Gear with v = 2.5
...