Skip to content

Instantly share code, notes, and snippets.

@semenovf
Last active February 6, 2025 07:52
Show Gist options
  • Save semenovf/1755a56eeb56d4cb1a12694adcc61c1c to your computer and use it in GitHub Desktop.
Save semenovf/1755a56eeb56d4cb1a12694adcc61c1c to your computer and use it in GitHub Desktop.
Serialization using QDataStream and std::vector
#include <QDataStream>
#include <QIODevice>
#include <vector>
struct StdVectorDevice : public QIODevice
{
std::vector<char> _data;
public:
StdVectorDevice ();
StdVectorDevice (std::size_t reserveSize);
public:
std::vector<char> move ()
{
return std::move(_data);
}
protected:
qint64 readData (char * data, qint64 len) override;
qint64 writeData (char const * data, qint64 len) override;
};
// Минимальные требования к сериализатору:
//
// Serializer & Serializer::operator << (T i), где T скалярный тип данных.
// Serializer & Serializer::writeBytes (char const * s, std::size_t len)
//
class Serializer: public QDataStream
{
StdVectorDevice _dev;
public:
Serializer (): QDataStream(& _dev)
{}
Serializer (std::size_t reserveSize)
: QDataStream(& _dev)
, _dev(reserveSize)
{}
public:
std::vector<char> move ()
{
return _dev.move();
}
};
class Deserializer: public QDataStream
{
public:
Deserializer(std::vector<char> && data): QDataStream()
{}
};
StdVectorDevice::StdVectorDevice ()
: QIODevice()
{}
StdVectorDevice::StdVectorDevice (std::size_t reserveSize)
: QIODevice()
, _data(reserveSize)
{}
qint64 StdVectorDevice::readData (char * data, qint64 len)
{
// if ((len = qMin(len, static_cast<qint64>(m_vector.size()) - m_ioIndex))
// <= 0) {
// return qint64(0);
// }
// std::copy(m_vector.cbegin() + m_ioIndex, m_vector.cbegin() + len, data);
// m_ioIndex += static_cast<int>(len);
// return len;
return qint64{0};
}
qint64 StdVectorDevice::writeData (char const * data, qint64 len)
{
if (len == 0)
return qint64{0};
auto offset = _data.size();
_data.resize(offset + len);
std::copy(data, data + len, _data.begin() + offset);
return len;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment