需求:一个进程需要将QList中保存的数据序列化后发送到另一个进程,另一个进程将收到的数据反序列化为QList后使用
方案:使用 QDataStream 配合 QByteArray来进行序列化,然后将QByteArray发送到对端
情景1: QList<obj> QList中每个元素是一个对象
说明:QList<obj>的使用方式存在性能问题,例如向队列中插入一个对象时,需要拷贝构造一个临时对象,将临时对象插入到list中;再比如:foreach(T t, list) 遍历时,每次也需要高考构造一个临时对象t
class CSubTest { // 这里不能继承QObject, 如果继承,无法使用foreach遍历,因为QObject禁止拷贝构造
public:
qint32 m_x;
qint32 m_y;
friend QDataStream& operator<<(QDataStream& out, const CSubTest& obj)
{
out << obj.m_x << obj.m_y;
return out;
}
friend QDataStream& operator>>(QDataStream& in, CSubTest& obj)
{
in >> obj.m_x >> obj.m_y;
return in;
}
};
class CTest:public QObject{
Q_OBJECT
public:
qint32 m_x;
qint32 m_y;
QList<CSubTest> m_z;friend QDataStream& operator<<(QDataStream& out, const CTest& obj)
{
out << obj.m_x << obj.m_y << obj.m_z;
return out;
}
friend QDataStream& operator>>(QDataStream& in, CTest& obj)
{
in >> obj.m_x >> obj.m_y >> obj.m_z;
return in;
}
};
测试代码:
CTest test;
test.m_x = 1;
test.m_y = 2;CSubTest subTest1;
subTest1.m_x = 11;
subTest1.m_y = 12;CSubTest subTest2;
subTest2.m_x = 21;
subTest2.m_y = 22;test.m_z.append(subTest1);
test.m_z.append(subTest2);QByteArray byteArray;
QDataStream out(&byteArray, QIODevice::WriteOnly);
out << test;QDataStream in(byteArray);
CTest test1;
in >> test1;qInfo("test1.m_x=%d; test1.m_y=%d", test1.m_x, test.m_y);
foreach(CSubTest tmp, test.m_z)
{
qInfo("tmp.m_x=%d; tmp.m_y=%d", tmp.m_x, tmp.m_y);
}输出:
Info: test1.m_x=1; test1.m_y=2
Info: tmp.m_x=11; tmp.m_y=12
Info: tmp.m_x=21; tmp.m_y=22
情景2: QList<obj*> QList中每个元素是一个对象指针
class CSubTest:public QObject {
Q_OBJECT
public:
qint32 m_x;
qint32 m_y;friend QDataStream& operator<<(QDataStream& out, const CSubTest& obj)
{
out << obj.m_x << obj.m_y;
return out;
}friend QDataStream& operator>>(QDataStream& in, CSubTest& obj)
{
in >> obj.m_x >> obj.m_y;
return in;
}
};class CTest:public QObject{
Q_OBJECT
public:
qint32 m_x;
qint32 m_y;
QList<CSubTest*> m_z;friend QDataStream& operator<<(QDataStream& out, const CTest& obj)
{
out << obj.m_x << obj.m_y;qint32 m_z_size = obj.m_z.size(); // 这里是关键,将数组个数也序列化;接收端才能知道list中有多少个对象
out << m_z_size;
foreach(CSubTest* tmp, obj.m_z)
{
out << *tmp; // tmp是指针,*tmp将对象中的数据序列化
}
return out;
}friend QDataStream& operator>>(QDataStream& in, CTest& obj)
{
in >> obj.m_x >> obj.m_y;qint32 m_z_size;
in >> m_z_size;for (int i = 0; i < m_z_size; i++)
{
CSubTest* tmp = new CSubTest;
in >> *tmp;
obj.m_z.append(tmp);
}
return in;
}
};测试代码:
CTest test;
test.m_x = 1;
test.m_y = 2;CSubTest* subTest1 = new CSubTest;
subTest1->m_x = 11;
subTest1->m_y = 12;CSubTest* subTest2 = new CSubTest;
subTest2->m_x = 21;
subTest2->m_y = 22;test.m_z.append(subTest1);
test.m_z.append(subTest2);QByteArray byteArray;
QDataStream out(&byteArray, QIODevice::WriteOnly);
out << test;QDataStream in(byteArray);
CTest test1;
in >> test1;qInfo("test1.m_x=%d; test1.m_y=%d", test1.m_x, test.m_y);
foreach(CSubTest* tmp, test.m_z)
{
qInfo("tmp.m_x=%d; tmp.m_y=%d", tmp->m_x, tmp->m_y);
}