Название: Сериализация QSettings Отправлено: xokc от Август 28, 2012, 16:39 Хотелось бы сериализовать QSettings в QByteArray, получить строку и передать ее по сети. На другой стороне из строки десериализовать.
В лоб не получается. Код Компилятор говорит 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, например
Код
И куда теперь при 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 можно считать "физическим файлом на носителе", тогда - да, существовал В общем-то да. Спасибо вам за ответы и отклик. В принципе, всё для себя уже уяснил. |