Russian Qt Forum

Qt => Общие вопросы => Тема начата: xokc от Август 28, 2012, 16:39



Название: Сериализация QSettings
Отправлено: xokc от Август 28, 2012, 16:39
Хотелось бы сериализовать QSettings в QByteArray, получить строку и передать ее по сети. На другой стороне из строки десериализовать.
В лоб не получается.
Код
C++ (Qt)
QSettings cfg;
cfg.setValue("user/name", 1);
 
QByteArray data;
QBuffer buffer(&data);
buffer.open(QIODevice::ReadWrite);
QDataStream out(&buffer);
out << cfg;
 
Компилятор говорит D:\Temp\.Mycop\-\seet\main.cpp:18: ошибка: C2679: binary '<<' : no operator found which takes a right-hand operand of type 'QSettings' (or there is no acceptable conversion)...

Какие ещё есть варианты?


Название: Re: Сериализация QSettings
Отправлено: Пантер от Август 28, 2012, 16:45
http://doc-snapshot.qt-project.org/4.8/qsettings.html#registerFormat


Название: Re: Сериализация QSettings
Отправлено: xokc от Август 28, 2012, 16:58
Читал уже. Чем это поможет?


Название: Re: Сериализация QSettings
Отправлено: Пантер от Август 29, 2012, 09:19
Вообще, у тебя есть http://doc-snapshot.qt-project.org/4.8/qsettings.html#allKeys и http://doc-snapshot.qt-project.org/4.8/qsettings.html#value. Этого хватит с головой.


Название: Re: Сериализация QSettings
Отправлено: xokc от Август 29, 2012, 11:18
Т.е. предлагается получить через allkeys все ключи, потом в цикле получить все значения, запихать всё это, например в QMap, сериализовать в QDataStream, дальше передать его по сети, на другом конце десериализовать и пользоваться? Как то уж очень некрасиво.
Вот если бы была возможность как-нибудь получить доступ к тому самому QSettings::SettingsMap &map, который передаётся в ReadFunc/WriteFunc...


Название: Re: Сериализация QSettings
Отправлено: Serr500 от Август 29, 2012, 12:17
Так в ReadFunc/WriteFunc и получайте.


Название: Re: Сериализация QSettings
Отправлено: xokc от Август 29, 2012, 14:03
Может я чего-то не понимаю? Вот я зарегистрировал собственный формат для QSettings определив соответствующие  ReadFunc/WriteFunc, например
Код
C++ (Qt)
bool readBinFile(QIODevice &device, QSettings::SettingsMap &map)
{
    map << device;
}
 
bool writeBinFile(QIODevice &device, const QSettings::SettingsMap &map)
{
    device << map;
}
 
int main(int argc, char *argv[])
{
    const QSettings::Format BinFormat =
            QSettings::registerFormat("bin", readBinFile, writeBinFile);
 
    QSettings settings(BinFormat);
 
}
 

И куда теперь при settings.sync() всё это запишется - в файл с расширением ".bin", который мне теперь надо считать в QByteArray  с диска и и потом удалить? А потом перед чтением опять же записать на диск, загрузить оттуда в QSettings и удалить файл?
На мой взгляд это вообще ни в какие вороте не лезет.


Название: Re: Сериализация QSettings
Отправлено: Alex Custov от Август 29, 2012, 14:29
так QSettings не даёт доступа к внутренним данным, костыли будут в любом случае. Свой формат тут вообще ни при чём. Я бы использовал QSettings::IniFormat и передавал по сети именно этот текстовый файл при этом сделав setFallbacksEnabled(false).


Название: Re: Сериализация QSettings
Отправлено: xokc от Август 29, 2012, 14:41
Свой формат тут вообще ни при чём.
Я об этом же пытаюсь говорить начиная с поста № 3 в этой теме, а мне уже дважды советуют к этому вопросу вернуться.

передавал по сети именно этот текстовый файл при этом сделав setFallbacksEnabled(false).
Ну уж нет - в файлы я сохранять ничего не буду. Уж лучше через allKeys и value. Или вообще от QSettings уйти.


Название: Re: Сериализация QSettings
Отправлено: Пантер от Август 29, 2012, 14:46
registerFormat и в writeBinFile запихиваешь все в глобальную переменную, игнорируя QIODevice.


Название: Re: Сериализация QSettings
Отправлено: Alex Custov от Август 29, 2012, 15:20
Ну уж нет - в файлы я сохранять ничего не буду. Уж лучше через allKeys и value. Или вообще от QSettings уйти.

QSettings и так сохраняется в файл, если задан формат INI, всё что нужно - сделать sync(), и передать файл по сети. На принимающей стороне этот файл нужно положить в нужное место и создать/пересоздать объект QSettings, всё...


Название: Re: Сериализация QSettings
Отправлено: Serr500 от Август 29, 2012, 15:24
Ну уж нет - в файлы я сохранять ничего не буду.

http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qbuffer.html (http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qbuffer.html) - QIODevice над QByteArray.


Название: Re: Сериализация QSettings
Отправлено: xokc от Август 29, 2012, 15:44
1.
registerFormat и в writeBinFile запихиваешь все в глобальную переменную, игнорируя QIODevice.
Так-то понятно. Дальше возникают проблемы с многопоточностью и прочие прелести глобальных переменных. Тоже корявенько как-то.

2.
QSettings и так сохраняется в файл, если задан формат INI, всё что нужно - сделать sync(), и передать файл по сети. На принимающей стороне этот файл нужно положить в нудное место и создать/пересоздать объект QSettings, всё...
Тоже понятно. Но не нужно мне в файл сохранять! С моей точки зрения еще хуже, чем п. 1.

3.
QIODevice над QByteArray.
Да проблема совсем не в этом. См. пп. 1 и 2.


Название: Re: Сериализация QSettings
Отправлено: Zerkin от Декабрь 16, 2015, 10:49
Прошу меня извинить за ап такой старой темы. Хотелось бы узнать у топикстартера (насколько я знаю, он активно посещает форум), решил ли он тогда эту проблему? У меня появилась схожая задача, необходимо запихнуть QSetting во что-то типа QByteArray, без всяких файлов и прочего.


Название: Re: Сериализация QSettings
Отправлено: __Heaven__ от Декабрь 16, 2015, 11:46
Вот же
Вообще, у тебя есть http://doc-snapshot.qt-project.org/4.8/qsettings.html#allKeys и http://doc-snapshot.qt-project.org/4.8/qsettings.html#value. Этого хватит с головой.


Название: Re: Сериализация QSettings
Отправлено: Zerkin от Декабрь 16, 2015, 11:53
Т.е. предлагается получить через allkeys все ключи, потом в цикле получить все значения, запихать всё это, например в QMap, сериализовать в QDataStream, дальше передать его по сети, на другом конце десериализовать и пользоваться? Как то уж очень некрасиво.

По поводу этого согласен с топикстартером. Это первое, что приходит в голову, думал, может, есть решение покрасивее.


Название: Re: Сериализация QSettings
Отправлено: Zerkin от Декабрь 16, 2015, 12:48
Или вообще не заморачиваться в этой задаче с QSettings, а использовать QVariantMap.


Название: Re: Сериализация QSettings
Отправлено: xokc от Декабрь 16, 2015, 23:05
Хотелось бы узнать у топикстартера (насколько я знаю, он активно посещает форум), решил ли он тогда эту проблему?
Нет, "красиво" не решил. Написал свой собственный промежуточный класс между QSettings и сетью. При создании он "читает" себя из QSettings, дальше сериализуется в QByteArray и "улетает" в сеть. А там десериализуется и уже используется без всяких QSettings. Вообще за эти три года я видимых изменений в QSetting в новых версиях не вижу, а хотелось бы :) Например ini файлы c комментариями, поддержку json конфигов "из коробки" или yaml. Очень нужны нормальные человекочитаемые самодокументирующиеся (с поддержкой комментариев) иерархические форматы (ini - не вариант, там с иерархией просто беда). И очень не хочется велосипедить самому :)


Название: Re: Сериализация QSettings
Отправлено: xokc от Декабрь 16, 2015, 23:07
Или вообще не заморачиваться в этой задаче с QSettings, а использовать QVariantMap.
Мне QSettings нужен был именно для иницииализации своего класса из конфига. Поэтому, напрямую QVariantMap не прокатывал.


Название: Re: Сериализация QSettings
Отправлено: Zerkin от Декабрь 17, 2015, 10:54
Я правильно понимаю, что физический файл на носителе все равно существовал?


Название: Re: Сериализация QSettings
Отправлено: xokc от Декабрь 17, 2015, 14:49
Не очень понял последнего вопроса. Если речь идет о самом начальном состоянии, то, если реестр Windows можно считать "физическим файлом на носителе", тогда - да, существовал. Если же о промежуточном (между сервером и сетью) - то, нет, промежуточной сериализации в файл на диске не было.


Название: Re: Сериализация QSettings
Отправлено: Zerkin от Декабрь 17, 2015, 15:07
если реестр Windows можно считать "физическим файлом на носителе", тогда - да, существовал

В общем-то да.

Спасибо вам за ответы и отклик. В принципе, всё для себя уже уяснил.