QT数据传输中的对象序列化与反序列化

最近在做一个linux+QT4.8的类似于CS架构的项目。于是乎,必然要涉及到进程中或者网络数据流中,关于数据对象的传输。可能就需要用到两种方式来解析传输数据,对应数据格式的字节位来解析,或者是采用数据序列化与反序列化的方式来解析。个人比较倾向于后者的方式,毕竟以前做过Java或C#的项目。也觉得用这种方式比较方便省事。所以就参考了部分资料,发现有些问题,然后又改进了部分,可能自己更加习惯面向对象的方式。

序列化与反序列化有各种好处,这里就不一一赘诉了。为了便于理解,这里只写出了关键代码。

student.h

#include 
#include 
#include 

class Student:public QObject
{
public:
    explicit Student(QObject *parent=0);
    Student();
    QString name;
    int age;

    Student& operator=(const Student &other);

#ifndef QT_NO_DATASTREAM
    friend QDataStream& operator>>(QDataStream &in,Student& data);
    friend QDataStream& operator<<(QDataStream &out,Student& data);
#endif

};
student.cpp

Student& Student::operator =(const Student &other)
{
    this->name = other.name;
    this->age = other.age;
}

#ifndef QT_NO_DATASTREAM
QDataStream& operator>>(QDataStream& in,Student& data)
{
    in>>data.name>>data.age;
    return in;
}

QDataStream& operator<<(QDataStream& out,Student& data)
{
    out<

上述代码,参考自 Qt持久性对象进行序列化,修改了一些容易产生歧义的问题。

经过实验之后,可以支持在网络传输中实现和进程通信(DBUS)中,实现序列化和反序列化。具体调用方式如下:

Student& Student::DeSerializable(const QByteArray &datagram)
{
    //读取文件流信息
    QByteArray tmp_array = datagram;
    QBuffer buffer(&tmp_array);
    buffer.open(QIODevice::ReadOnly);

    QDataStream in(&buffer);
    //反序列化,获取对象信息
    Student student;
    in>>student;
    buffer.close();
    return student;
}

QByteArray& Student::Serializable(const Student &student)
{
    QByteArray tmp_array;
    QBuffer buffer(&tmp_array);
    buffer.open(QIODevice::WriteOnly);

    QDataStream out(&buffer);
    //序列化对象信息
    out<

 因为在网络中传输的是QByteArray,序列化之后,就可以直接得到传输对象,方便解析。

本人才疏学浅,很少发技术贴。如果有错误之处,或者侵权之处,还请大家批评指正,不吝赐教!


你可能感兴趣的:(中标麒麟V3版本+QT4.8,QT,序列化)