如何便移(de)序列化qint32
How to portably (de)serialize qint32?
QT的文档指出qint32
是signed 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支持)
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 如何反序列化数组?
- 如何使用提升序列化?
- 序列化多晶型接口
- 如何便移(de)序列化qint32