如何便移(de)序列化qint32

How to portably (de)serialize qint32?

本文关键字:序列化 qint32 de 何便移      更新时间:2023-10-16

QT的文档指出qint32signed int的Typedef,并保证在QT支持的所有平台上是32位。[docs]

这表明signed int不能小于short,并且大小至少必须为16位。因此,不能仅保证单独使用Typedef中的大小。QT似乎可以解决。

so(de)与qt序列化这很不错,因为大小将永远是那个。但是,这对我认为的这些数字的二进制表示没有任何说法。当(de)便便序列化时,这很重要。例如这样做:

QFile file("somefile");
file.open(QIODevice::WriteOnly);
qint32 i = 10;
file.write(reinterpret_cast<const char*>(&i), sizeof(i));
file.flush();
file.close();

将以二进制形式的文件写入值10的 qint32。当我通过网络将该文件发送到QT中编写的另一个应用程序时:

QFile file("somefile");
file.open(QIODevice::ReadOnly);
qint32 i = 0;
file.read(reinterpret_cast<char*>(&i), sizeof(i));
file.close();

我确实会拿回一个数字,但是保证它永远是10吗?我不这么认为,因为该机器上10的二进制表示可能有所不同。但是我有可能理解这是错误的,这是一个非问题(至少对于QT支持的平台)。

因此,我的问题是:如何在QT中序列化原始类型?还是大小可以保证?

您可以使用qdatastream进行(de)序列化。它从Qiodevice继承的任何内容中写入/读取,并具有QINT32的明确输入和输出操作员。

我可以肯定的是,对于由QT支持的所有平台,以下 assert(CHAR_BIT == 8)

鉴于这一假设,唯一要担心的是字节端。不幸的是,您的演员不会考虑终点。它以本地endianness的形式写入整数,并假设数据是本地的。

事实上的标准解决方案是始终转换为大型末日的网络endianness 。您会发现QT提供了做到这一点的功能:http://doc.qt.io/qt-4.8/qtendian.html

编辑:尽管您可能需要查看G.M.的答案,而不是自己实施序列化。

您不受二进制表示的限制。将它们序列化为字符串(例如,QT具有JSON支持)