Как Вы сериализируете объект в C++?

У меня есть маленькая иерархия объектов, которые я должен сериализировать и передать через сокетное соединение. Я должен оба сериализировать объект, затем десериализовать его на основе того, каково тип это. Существует ли простой способ сделать это в C++ (поскольку существует в Java)?

Есть ли какая-либо сериализация C++ примеры кода онлайн или учебные руководства?

Править: Только, чтобы быть ясным, я ищу методы при преобразовании объекта в массив байтов, затем обратно в объект. Я могу обработать сокетную передачу.

79
задан Tony The Lion 10 May 2011 в 12:14
поделиться

2 ответа

Говоря о сериализации, сериализация API повышения происходит по моему мнению. Что касается передачи сериализированных данных по сети, я или использовал бы сокеты Беркли или asio библиотека .

Редактирование:
, Если Вы хотите сериализировать свои объекты к массиву байтов, можно использовать сериализатор повышения следующим образом (взятый от учебного сайта):

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
class gps_position
{
private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & degrees;
        ar & minutes;
        ar & seconds;
    }
    int degrees;
    int minutes;
    float seconds;

public:
    gps_position(){};
    gps_position(int d, int m, float s) :
    degrees(d), minutes(m), seconds(s)
    {}
};

Фактическая сериализация затем довольно легка:

#include <fstream>
std::ofstream ofs("filename.dat", std::ios::binary);

    // create class instance
    const gps_position g(35, 59, 24.567f);

    // save data to archive
    {
        boost::archive::binary_oarchive oa(ofs);
        // write class instance to archive
        oa << g;
        // archive and stream closed when destructors are called
    }

Десериализация работает аналогичным способом.

существуют также механизмы, которые позволяют Вам обработать сериализацию указателей (сложные структуры данных как локон и т.д. не являются никакой проблемой), производные классы, и можно выбрать между текстовой сериализацией и двоичным файлом. Помимо всего STL контейнеры поддерживаются из поля.

53
ответ дан Frank 24 November 2019 в 10:20
поделиться

В некоторых случаях, при контакте с простыми типами, можно сделать:

object o;
socket.write(&o, sizeof(o));

Это в порядке как подтверждение концепции или первый проект, таким образом, другие члены Вашей команды могут продолжать работать над другими частями.

, Но рано или поздно, обычно раньше , это получит Вас вред!

Вы сталкиваетесь с проблемами с:

  • Виртуальные таблицы указателя будут повреждены.
  • Указатели (к данным/участникам/функциям) будут повреждены.
  • Различия в дополнении/выравнивании на различных машинах.
  • Большие/С прямым порядком байтов проблемы порядка байтов.
  • Вариации в реализации плавающих/двойных.

(Плюс Вы должен знать то, во что Вы распаковываете на стороне получения.)

можно улучшить это путем разработки собственных методов маршалинга/немаршалинга для каждого класса. (Идеально виртуальный, таким образом, они могут быть расширены в подклассах.) Некоторые простые макросы позволят Вам для выписывания различных основных типов вполне быстро в порядке big/little-endian-neutral.

, Но такая трудная работа намного лучше, и более легко, обработанный через библиотека сериализации повышения .

13
ответ дан Mr.Ree 24 November 2019 в 10:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: