Доброе утро, я пишу о поиске способа сохранения объекта прозрачным способом по отношению к фактическому методу сохранения.В моем приложении было бы неплохо изменить способ сохранения объектов, изменив только класс, используемый для сохранения.Другими словами, я хотел бы иметь пару методов в моем классе с именем «store / load», которые «выбирают», что сохранить, и передают это методу класса Saver, который будет обрабатывать способ сохранения информации.
Во время поисков я нашел хороший способ сэкономить через сериализацию, используя 'boost :: serialization' (https://www.boost.org/doc/libs/1_40_0/libs/serialization/doc/index.html). Моя проблема - сделать что-то, что может сохранить то, что я хочу, используя boost или используя запросыв базу данных.
В моем приложении я считаю, что сериализация может быть более полезной, чем хранение в базе данных, но все же идея наличия информации в базе данных привлекательна, если другие программы могут получить доступ к информации.
Вот моя первая идея (просто попытка), которая не годится, поскольку позволяет мне использовать boost только с примитивными типами или с STL с примитивным параметром. Объект класса TextSaver хранится в объекте класса Iхотите поддержать сохранение, чем этот объект вызывает saverIstance.store (params ...) со всеми необходимыми параметрами хранить.Чем заставка может использовать boost для сериализации или заполнения подготовленного оператора и выполнения запроса в базе данных.
class TextSaver{
std::string storeFile; /**< Output file name */
std::string loadFile; /**< Input file name */
std::ifstream ifs; /**< Input stream */
std::ofstream ofs; /**< Output stream */
boost::archive::text_oarchive *oa=nullptr; /**< pointer to the archive structure for output */
boost::archive::text_iarchive *ia=nullptr; /**< pointer to the archive structure for input */
bool firstLoad=true;
bool firstStore=true;
friend class boost::serialization::access;
public:
TextSaver(std::string input, std::string output): storeFile{output}, loadFile{input}, ofs{storeFile}, ifs{loadFile}{}
void store_init(){
oa=new boost::archive::text_oarchive(ofs);
firstStore=false;
};
template <typename T>
void store(T&& val){
if(firstStore) store_init();
//std::cout<<"saved: "<<val<<std::endl;
std::cout<<"Store completed"<<std::endl;
*oa << val;
}
template <typename T, typename... Args>
void store(T&& val, Args&&... argv){
if(firstStore) store_init();
//std::cout<<"saved: "<<val<<std::endl;
*oa << val;
store(argv...);
}
void load_init(){
ia=new boost::archive::text_iarchive(ifs);
firstLoad=false;
}
template <typename T>
void load(T&& last){
if(firstLoad) load_init();
*ia>>last;
std::cout<<"loaded: "<<last<<std::endl;
std::cout<<"Load completed"<<std::endl;
}
template <typename T, typename... Args>
void load(T&& val, Args&&... argv){
if(firstLoad) load_init();
*ia>>val;
std::cout<<"loaded: "<<val<<std::endl;
load(argv...);
}
~TextSaver(){
delete oa;
delete ia;
}
};
BOOST_CLASS_VERSION(TextSaver, 2)
Проблема в том, что я не могу найти способ обернуть шаги, необходимые для «boost»(реализация метода serialize ()).Если, например, у меня есть std :: vector, это будет проблемой, если я не реализую способ хранения объектов Person, и это нарушит тот факт, что я хочу, чтобы мой класс не зависел напрямую от 'boost'.Я видел это Расширение расширенной сериализации и Библиотека для сохранения объектов C ++ в базу данных , но я не могу найти способ обобщить.
Извините заДлинный вопрос, есть ли у кого-нибудь идеи для достижения этой цели?