Обобщение сохранения через сериализацию или базу данных в C ++ - PullRequest
0 голосов
/ 12 июня 2019

Доброе утро, я пишу о поиске способа сохранения объекта прозрачным способом по отношению к фактическому методу сохранения.В моем приложении было бы неплохо изменить способ сохранения объектов, изменив только класс, используемый для сохранения.Другими словами, я хотел бы иметь пару методов в моем классе с именем «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 ++ в базу данных , но я не могу найти способ обобщить.

Извините заДлинный вопрос, есть ли у кого-нибудь идеи для достижения этой цели?

...