У меня есть маленькая иерархия объектов, которые я должен сериализировать и передать через сокетное соединение. Я должен оба сериализировать объект, затем десериализовать его на основе того, каково тип это. Существует ли простой способ сделать это в C++ (поскольку существует в Java)?
Есть ли какая-либо сериализация C++ примеры кода онлайн или учебные руководства?
Править: Только, чтобы быть ясным, я ищу методы при преобразовании объекта в массив байтов, затем обратно в объект. Я могу обработать сокетную передачу.
Говоря о сериализации, сериализация 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 контейнеры поддерживаются из поля.
В некоторых случаях, при контакте с простыми типами, можно сделать:
object o;
socket.write(&o, sizeof(o));
Это в порядке как подтверждение концепции или первый проект, таким образом, другие члены Вашей команды могут продолжать работать над другими частями.
, Но рано или поздно, обычно раньше , это получит Вас вред!
Вы сталкиваетесь с проблемами с:
(Плюс Вы должен знать то, во что Вы распаковываете на стороне получения.)
можно улучшить это путем разработки собственных методов маршалинга/немаршалинга для каждого класса. (Идеально виртуальный, таким образом, они могут быть расширены в подклассах.) Некоторые простые макросы позволят Вам для выписывания различных основных типов вполне быстро в порядке big/little-endian-neutral.
, Но такая трудная работа намного лучше, и более легко, обработанный через библиотека сериализации повышения .