Как сохранить std :: vector объектов C ++ в двоичном формате на диск? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть вектор указателей базового класса на потенциально разнородные объекты (все они получены из одного базового класса).Я хотел бы сохранить этот вектор на диск в двоичном формате.Есть ли в C ++ библиотека для хранения объектов и контейнеров stl в двоичном формате?

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Учтите это:

class Base {
protected:
    unsigned int id_;
protected:
    Base() {}
    virtual ~Base(){}
};

class DerivedA : public Base {
public:
    int someIntA_;
    short someShortA_;
};

class DerivedB : public Base {
public:
    int someIntB_;
    double someDoubleB_;
};

void writeToFile( const std::string& filename, std::vector<Base*>& objs ) {
    // first few elements in objs
    objs[0] = DerivedA;
    objs[1] = DerivedB;
    objs[2] = DerivedB;
    objs[3] = DerivedA;

    // how to pack & extract data in binary?
}

Ваш вектор содержит указатели на Base, которые в зависимости от системы и архитектуры будут определять sizeof() тип указателя.Большинство систем имеют 4 байта для типа указателя, но это не гарантируется.Однако типы данных, на которые указывают эти указатели, имеют свои производные типы.В памяти sizeof(DerivedA) будет отличаться от sizeof(DerivedB).Вы должны сообщить своему C++ Compiler о том, как анализировать эти данные как при записи в файл, так и при чтении - извлечении из файла, и это не включает какие-либо методы сжатия, которые могут использоваться.

Теперь, как и для любых автоматически генерирующих библиотек, которые будут сериализировать ваши данные для вас;Я не знаком ни с чем из головы, но я видел, что другие дали вам несколько советов, которые, возможно, стоит рассмотреть, в противном случае вы сами пишете в файлы и из файлов в соответствии с вашими типами данных.и их структуры.

0 голосов
/ 29 октября 2018

Есть ли в C ++ библиотека для хранения объектов и контейнеров stl в двоичном формате?

Да, Boost Serialization делает именно это. Одна из целей:

  • Сериализация контейнеров STL и других часто используемых шаблонов.

Я бы не стал заново изобретать это колесо - в этой области есть множество угловых случаев и хитрых проблем, которые уже были решены для вас.

0 голосов
/ 29 октября 2018

Я бы предложил библиотеку Protobuf от Google, которая предназначена только для решения этой проблемы. Это двоичный файл, поэтому не читаемый человеком. https://developers.google.com/protocol-buffers/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...