Построить объект из архива последовательной сборки

Можно ли строить объекты непосредственно из архива?

Что-то вроде этого…

// Non-working pseudo code struct Foo { BOOST_SERIALIZATION_SPLIT_MEMBER(); std::vector data; Foo() { // populate "data" by doing calculation data.push_back(1); data.push_back(2); } template Foo( Archive & ar ) { // populate "data" by rading the archive } template void save(Archive & ar, const unsigned int version) const { // Normal serialization of data ar << data; } }; int main(int argc, const char *argv[]) { // deserialize boost::archive::text_iarchive oar(std::cin); Foo foo(oar); return 0; } 

Вы можете использовать десериализационный конструктор :

 #include  #include  #include  class Point { public: Point() = default; Point(boost::archive::text_iarchive& archive) { archive >> *this; } float x = 1.; float y = 2.; private: friend class boost::serialization::access; template void serialize(TArchive & archive, const unsigned int version) { archive & x; archive & y; } }; int main() { Point p; px = 5; py = 6; 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.x << " " << pointRead.y << std::endl; return 0; } 

Как я сказал в комментарии. Да, нет проблем с построением из архива. (Еще одна альтернатива – иметь функцию static load но это может привести к штрафам за производительность).

Единственная потенциальная проблема, которую я вижу с вашим подходом, заключается в том, что ваш конструктор может принимать почти что угодно в качестве аргумента и может создавать проблемы. И это может помешать конструктору копирования и другим конструкторам одиночных аргументов, полагающихся на неявное преобразование.

Поэтому нужно ограничиться только архивированием.

Существуют разные способы сделать это, но в этом разговоре http://marc.info/?l=boost&m=121131260728308&w=2 , а также тот факт, что дерево наследования archives документировано http: //www.boost .org / doc / libs / 1_35_0 / libs / serialization / doc / class_diagram.html , я думаю, что это лучшее решение – проверить, что аргумент получен из basic_iarchive .

 #include struct Foo { ... std::vector data; Foo() { // populate "data" by doing calculation data.push_back(1); data.push_back(2); } template::value>> Foo( IArchive & ar ) { ar >> data; // populate "data" by reading the archive } ... }; int main(int argc, const char *argv[]) { // deserialize boost::archive::text_iarchive iar(std::cin); Foo foo(iar); // will also work with other archives } 

Что касается того, что происходит, когда ваши данные не являются конструктивными по умолчанию, см. Обсуждение выше.