计算Qt中对象的序列化大小

时间:2015-04-18 09:29:05

标签: c++ qt serialization file-handling

如何知道qt数据类型的大小(以字节为单位);如果这些数据类型是在一些QFile上编写的,则包括QString对象。我必须在Student类中实现sizeOf()函数,如下所示;像我们{C}中的sizeof(struct student)

学生班

        #include<QtCore>

        class Student
        {
        public:

            QString name,fname;
            quint8 age,weight,clss;

            Student(){

            }

    /*the following function should return the size of this object in bytes; 
     I will use QDataStream & operator<<(QDataStream &out, Student &f)
     function  to write data to a QFile   */
        qint16 sizeOf()
        {
            // needs implementation;
        }

        };

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

            out<<f.name<<f.fname<<f.age<<f.weight<<f.clss<<f.next;
            return out;


        }
        QDataStream & operator>>(QDataStream &in, Student &f)
        {

            in>>f.name>>f.fname>>f.age>>f.weight>>f.clss>>f.next;

            return in;
        }

我知道可以使用QDataStream & operator>>(QDataStream &in, Student &f)读取数据;但我也想知道其他一些案件的尺寸。

这不会给我一个有效的文件大小。似乎Qt在序列化时增加了一些额外的位;可能是因为不同平台上的字节序独立性。实际大小始终大于sizeOf()函数

返回的大小
qint16 sizeOf()
            {
                qint16 size=0;
                size+=sizeof(quint8)*3; // size of age, weight and clss 
                                        //variables all have type quint8
                size+=name.size()*16;   // number of characters in string
                                         // multiply with 16 bit QChar
                size+=fname.size()*16;
                return size;
            }

我正在使用QFile,QDataStream api。 Windows 8上的Qt版本4.8。​​

2 个答案:

答案 0 :(得分:4)

sizeof给出的大小不会反映对象可能具有的实际大小。例如,无论实际字符串有多长,32位构建中的sizeof a QString将始终为4个字符。

这个sizeof运算符包含不需要序列化的东西,比如对象的vtable指针,并没有考虑该对象的动态分配资源的大小。

您可以轻松确定可序列化的大小,只需使用QDataStream,然后从device()获取pos(),输入数据流中的对象并与{{1之后。

此外,这一行显然是错误的:pos()它不会给你三倍大小的字节。它将为您提供size+=sizeof(quint8*3)的大小,这是乘法后结果的提升方式。

这是一个可以用来执行任务的漂亮的小班:

int

然后使用它:

class SerialSize {
public:
  SerialSize() : stream(&data) { data.open(QIODevice::WriteOnly); }

  template <typename T>
  quint64 operator ()(const T & t) {
    data.seek(0);
    stream << t;
    return data.pos();
  }

private:
  QBuffer data;
  QDataStream stream;
};

答案 1 :(得分:0)

在执行sizeOf函数时,您应该这样做 尝试将size+=sizeof(quint8*3)更改为size+=sizeof(quint8) * 3