Недавно я использовал save_construct_data()
и load_construct_data()
, когда мне нужно сериализовать объект без конструктора по умолчанию. Так как нет смысла делать:
MyObject a; // can't do this because there is no default constructor
archive >> a;
мы должны сделать:
MyObject* aPointer;
archive >> a;
который вызывает load_construct_data()
перед serialize()
. Однако, конечно, это работает только в том случае, если объект был сериализован с использованием save_constructor_data()
, который вызывается только в том случае, если он написан как указатель, например.
MyObject a(1,2);
MyObject aPointer = &a;
archive << aPointer;
Все это работает нормально, но кажется, что archive << a;
работает нормально, но логически не имеет смысла, так как его никогда нельзя будет десериализовать. Есть ли способ запретить этот вызов, чтобы объекты (возможно, члены класса большего класса и т. д.) случайно не записывали Object не через указатель?
------------- РЕДАКТИРОВАТЬ ----------
Пытаясь последовать предложению SergeyA, я сделал следующую демонстрацию. К сожалению, кажется, что данные не читаются правильно?
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/serialization.hpp>
class Point
{
private:
friend class boost::serialization::access;
template<class TArchive>
void serialize(TArchive& archive, const unsigned int version)
{
archive & mX;
archive & mY;
}
public:
template<class TArchive>
Point(TArchive& archive)
{
serialize(archive, 0);
}
Point(){} // Only provided to test Works()
Point(const float x, const float y) : mX(x), mY(y) { }
float mX = 4;
float mY = 5;
};
void Works()
{
std::cout << "Works():" << std::endl;
Point p(1,2);
std::ofstream outputStream("test.archive");
boost::archive::text_oarchive outputArchive(outputStream);
outputArchive << p;
outputStream.close();
// read from a text archive
std::ifstream inputStream("test.archive");
boost::archive::text_iarchive inputArchive(inputStream);
Point pointRead;
inputArchive >> pointRead;
std::cout << pointRead.mX << " " << pointRead.mY << std::endl;
}
void DoesntWork()
{
std::cout << "DoesntWork():" << std::endl;
Point p(1,2);
std::ofstream outputStream("test.archive");
boost::archive::text_oarchive outputArchive(outputStream);
outputArchive << p;
outputStream.close();
std::ifstream inputStream("test.archive");
boost::archive::text_iarchive inputArchive(inputStream);
Point pointRead(inputArchive);
std::cout << pointRead.mX << " " << pointRead.mY << std::endl;
}
int main()
{
Works(); // Output "1 2"
DoesntWork(); // Output "0 0"
return 0;
}
serialize()
? Если у меня есть архив, и я хочуarchive << myClass;
, то здесь будет вызыватьсяserialize()
. Я думаю, было бы просто невозможно вызватьMyClass myClass; archive >> myClass;
, потому что нет конструктора по умолчанию, поэтому я бы просто вызвалserialize(archive);
из сериализующего конструктора? - person David Doria   schedule 29.02.2016