Last active
February 6, 2025 07:52
-
-
Save semenovf/1755a56eeb56d4cb1a12694adcc61c1c to your computer and use it in GitHub Desktop.
Serialization using QDataStream and std::vector
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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