使用 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 反序列化?的主要内容,如果未能解决你的问题,请参考以下文章
Java反序列化漏洞(ysoserial工具使用shiro反序列化利用)