使用 QTextStream 反序列化?

Posted

技术标签:

【中文标题】使用 QTextStream 反序列化?【英文标题】:Deserialization with QTextStream? 【发布时间】:2016-04-12 04:52:32 【问题描述】:

需要:从/向人类可读/可编辑文件读取/写入标准 Qt 类型的结构。

尝试过:QSettings。让它工作起来相当容易。问题:QSettings 会定期自动调用 QSettings::sync(),并且在 dtor 处。我需要确保设置文件仅在请求时更新,并且运行时数据结构仅在请求时修改。

尝试过:QDataStream。问题:人类不可读/不可编辑。

尝试过:手动序列化和反序列化,使用标准 readline 和 QString::toInt() 等。我现在必须支持 QSettings 支持的类型,但 QString 没有 'toFoo()' 方法。这种方式将需要更多、更多的编码。

有没有办法在不使用 QSettings 的情况下序列化和反序列化人类可读的数据?关于它的一切都是违反要求的。这些文件应该以不同的方式命名。应该以不同的方式控制访问。

如果有简单的方法来阻止sync(),这可能就足够了。我们可能可以解决其他任何问题。给我带来最多问题的是“同步”。

【问题讨论】:

您可以使用QSettings 不作为类的成员变量,而是根据您的要求在代码的不同位置创建或删除的局部变量。 QTextStream 遇到什么问题? 如果您希望人类可读,那么使用 JSON 进行自己的序列化可能是值得的。这里有一个例子:doc.qt.io/qt-5/qtcore-json-savegame-example.html @Tarod 这可能行得通。我可以通过在 QSettings 中更改文件名来保护文件,并保护 QSettings 实例......通过仔细注意事件循环。如果我能保证我们不会在两次通话之间重新输入它,那可能就足够了。 @SaZ 它不会自动反序列化,也不会针对 QSettings 所做的所有类型,AFAICT。 @NicholasSmith 如果我不得不求助于手动创建序列化格式,我们就不会使用 JSON。我认为这些课程实际上对我没有帮助。我还是要写 read()/write()。 @SaburoutaMishima 是的,这个想法是自己实现一种同步,因为正如你所说,你需要根据请求更新文件。 【参考方案1】:

查看 QSettings 的源代码后,它似乎以一种独特的方式执行人类可读的序列化-反序列化。在 Qt 的其他部分似乎不存在此功能。此外,还有许多文件系统会自动更改的地方。

这在 Qt 中是不可能的。

【讨论】:

以上是关于使用 QTextStream 反序列化?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jackson 自定义反序列化:扩展默认反序列化器

使用C# json 二维数组 反序列化

Java反序列化漏洞(ysoserial工具使用shiro反序列化利用)

在身份验证期间使用 JWT 令牌反序列化 cookie 无法正确反序列化

Dubbo中Map类型默认的序列化和反序列化

c# 多个json字符串反序列化