您如何序列化QMap?

铝碳

我正在尝试学习如何使用以下代码在窗口化应用程序中序列化QMap对象:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QString>
#include <QDataStream>
#include <QMap>
#include <QDebug>


void write ()
{
   QString filename = "Z:/snippets.txt";
   QFile myFile (filename);

   if (!myFile.open(QIODevice::WriteOnly))
   {
       qDebug() << "Could not write " << filename;
       return;
   }

   QMap<QString,QString> map;
   map.insert("one","this is 1");
   map.insert("two","this is 2");
   map.insert("three","this is 3");

   QDataStream out (&myFile);
   out.setVersion(QDataStream::Qt_5_3);
   out<<map;

   myFile.flush();
   myFile.close();
}

QMap<QString,QString> read ()
{
    QString filename = "Z:/snippets.txt";
    QFile myFile (filename);
    QMap<QString,QString> map;
    QDataStream in (&myFile);
    in.setVersion(QDataStream::Qt_5_3);

    if (!myFile.open(QIODevice::WriteOnly))
    {
        qDebug() << "Could not read " << filename;
        return (map);
    }

    in >> map;

    myFile.close();
    return(map);
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this); 

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_btnSave_clicked()
{
    write();
}

void MainWindow::on_btnLoad_clicked()
{
    QMap<QString,QString> map;
    map = read();
    QMapIterator<QString,QString> i(map);
    //do other stuff
}

write()btnSave调用功能确实可以保存QMap。我可以在snippets.txt中看到数据。我可以在调试器中看到,该read()函数没有为map变量分配任何内容我想念什么?

lpapp

正确的QMap序列化和反序列化代码如下:

main.cpp

#include <QString>
#include <QFile>
#include <QMap>
#include <QDataStream>
#include <QDebug>

void write()
{
   QString filename = "snippets.txt";
   QFile myFile(filename);
   if (!myFile.open(QIODevice::WriteOnly))
   {
       qDebug() << "Could not write to file:" << filename << "Error string:" << myFile.errorString();
       return;
   }

   QMap<QString, QString> map;
   map.insert("one", "this is 1");
   map.insert("two", "this is 2");
   map.insert("three", "this is 3");

   QDataStream out(&myFile);
   out.setVersion(QDataStream::Qt_5_3);
   out << map;
}

QMap<QString,QString> read()
{
    QString filename = "snippets.txt";
    QFile myFile(filename);
    QMap<QString, QString> map;
    QDataStream in(&myFile);
    in.setVersion(QDataStream::Qt_5_3);

    if (!myFile.open(QIODevice::ReadOnly))
    {
        qDebug() << "Could not read the file:" << filename << "Error string:" << myFile.errorString();
        return map;
    }

    in >> map;
    return map;
}

int main()
{
    write();
    qDebug() << read();
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp

生成并运行

qmake && make && ./main

输出

QMap(("one", "this is 1")("three", "this is 3")("two", "this is 2"))

您遇到了几个问题:

这使您很难揭示真正的问题。

没有适当的错误报告,这是对您隐藏的问题。这里的问题是,当您打开文件以仅进行写入时,任何后续的读取操作自然会产生空结果。这样做时,它有点隐藏QDataStream,但是如果您直接阅读QFile实例时快速浏览QIODevice文档,则会更加清楚错误打开模式底层内容

从设备读取最多maxSize个字节到数据中,并返回读取的字节数。如果发生错误,例如尝试从以WriteOnly模式打开的设备中读取数据,则此函数返回-1。

如果您检查了错误,这将变得更加清楚。公平地说,在您的情况下,在此简单代码段中可以接受操作之前共享文件而不关闭它。在这种情况下,您将使用类似重新搜索开头和QIODevice :: ReadWrite的方法。话虽如此,这只是另一种方式。

  • 错误使用qDebug()

这只是一个旁注,但是您正在显式添加空格,而qDebug()已经为您完成了此操作。

  • 序列化时不必要地刷新文件。

这是多余的,因为通过类析构函数关闭文件描述符时,它是自动完成的。

  • 不必要地关闭文件对象

这是由适当的RAII自动完成的。如果该文件仍处于打开状态,则分解器将为您关闭它。由于您离开了函数的作用域,因此在堆栈上构造文件对象时将自动调用析构函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

您如何使用newtonsoft JSON反序列化器反序列化Geopoint?

来自分类Dev

如何在单个文件中序列化QHash和QMap?

来自分类Dev

您如何使用Newtonsoft.Json“真正”序列化循环引用对象?

来自分类Dev

无根反序列化JSON数组。您如何读取数组值?

来自分类Dev

如何序列化QJSonObject?

来自分类Dev

如何序列化JPanel?

来自分类Dev

如何序列化数组?

来自分类Dev

如何序列化异常

来自分类Dev

如何序列化字段?

来自分类Dev

如何序列化数组?

来自分类Dev

如何序列化 TransactionBuilder

来自分类Dev

如何序列化和反序列化 Hashtable?

来自分类Dev

仅从 json 序列化您需要的数据

来自分类Dev

您如何使用Json.net修改仅一个字段的Json序列化?

来自分类Dev

您如何使用Json.net修改仅一个字段的Json序列化?

来自分类Dev

如何实现可序列化的交易?

来自分类常见问题

如何反序列化XML文档

来自分类Dev

如何序列化这种json?

来自分类Dev

如何反序列化oData JSON?

来自分类Dev

如何访问jQuery序列化数据?

来自分类Dev

反序列化如何工作?

来自分类Dev

如何使MERGE可序列化

来自分类Dev

如何序列化当前表格?

来自分类Dev

如何序列化JavaScript对象

来自分类Dev

如何序列化异步/等待?

来自分类Dev

惰性字段的序列化如何工作?

来自分类Dev

如何序列化boost :: rational

来自分类Dev

tkinter:如何序列化树视图?

来自分类Dev

我如何序列化JButton []