Comments 12
Добавить в начале еще имя\ID сериализуемого класса + сделать «менеджер» таких классов, по типу qRegisterMetaType и можно принимая поток на вход на выходе иметь готовые экземпляры класса без дополнительных телодвижений. Удобно если классы имеют общий интерфейс.
0
Есть идеи для модификации/апгрейцда конструкции:
1. Поток поддерживаеит передачу информацию о версии. Внедрить контроль версии.
2. В metapropertyu имя класса и так автоматически введено. Поэтому — передается. Соответственно наша задача — лишбь его проконтролировать…
3.Есть идея как обойти проблему того что QObject нрельзщя напрямукю сделать свойством (Q_DISABLE_COPY в базовом классе QObject). Есть одна идейка основанная на реализации конструктора копирования и регистрации метатипа.
4.Касаемо непосредственно вашей идеи — имел некоторые грабли с автоматическим конструированием объектов через QMetaObject::construct. Не всегда дефолтный конструктор отрабатывал как хотелось как результат получали вылеты. Пока что — разбираюсь с тем как корректно создавать экземпляры объектов со свойствами через метатип.
Надеюсь завтра часть информации выяснить и дополнить статью.
P.S. не бейте сильно Qt я занялся относительно недавно, всего пару месяцев. До этого шарпом занимался, поэтому нюансы объектной системы могу и не знать :)
1. Поток поддерживаеит передачу информацию о версии. Внедрить контроль версии.
2. В metapropertyu имя класса и так автоматически введено. Поэтому — передается. Соответственно наша задача — лишбь его проконтролировать…
3.Есть идея как обойти проблему того что QObject нрельзщя напрямукю сделать свойством (Q_DISABLE_COPY в базовом классе QObject). Есть одна идейка основанная на реализации конструктора копирования и регистрации метатипа.
4.Касаемо непосредственно вашей идеи — имел некоторые грабли с автоматическим конструированием объектов через QMetaObject::construct. Не всегда дефолтный конструктор отрабатывал как хотелось как результат получали вылеты. Пока что — разбираюсь с тем как корректно создавать экземпляры объектов со свойствами через метатип.
Надеюсь завтра часть информации выяснить и дополнить статью.
P.S. не бейте сильно Qt я занялся относительно недавно, всего пару месяцев. До этого шарпом занимался, поэтому нюансы объектной системы могу и не знать :)
0
В чем заключалась некоректность?
Хотя самый правильный способ использовать newInstance. Надо будет поэкспериментировать.
Пока только использовал метаобъекты для автоматической регистрации «сервисов» в XMLRPC сервере. Надо будет оформить топик наверно, допилить лишь только код )
Хотя самый правильный способ использовать newInstance. Надо будет поэкспериментировать.
Пока только использовал метаобъекты для автоматической регистрации «сервисов» в XMLRPC сервере. Надо будет оформить топик наверно, допилить лишь только код )
+1
Спасибо за ссылку. Как мне кажется, Я просто не ставил Q_INVOKABLE для конструкторов, поэтому при их вызове всё «рушилось». Надо будет проверить, и если всё ок, статья обретет новый и законченный смысл, так как останется лишь ограничение по тому что если используем указатель в виде свойста — его на выходе и получим. С указателями надо будет както «допиливать».
0
UFO just landed and posted this here
предЫстория, а в по содержанию — познавательно, спасибо.
0
Интересненько, вот думаю, насколько можно выиграть во времени загрузки, если вместо инициализации сложных объектов, просто их сериализовать и сбрасывать на диск, а потом десериализовать
0
По времени не знаю, думаю ради только этого игра свеч может и не стоит (хотя… хависит от кол-ва объектов различных класов). В а универсальности сброса — хоть на диск, хоть в инет через поток, хоть просто в память… Да мало ли применений стандартному потоку придумать можно…
0
Хоть и дал инвайт автору, но со статьей немножко не согласен (основная цель — привлеч Qt-шников в хабл :-) даешь нас больше :-) )
Так вот не очень понравилась идея наследования и сторонних классов, как по мне то удобнее непосредственно перекрыть метод >> и << самого датастрима, гдето так, особенно в коде не уверен, я его не проверял:
Используя перекрытие именно таким образом, можно вообще к метаданным и не грестись, а серилизовать нужные нам поля, даже если они не являются свойствами, плюс можно также серизовать данные данные из приватного класса (если используется Pimp — паттерн). Также возможно воспользоватся полиморфизмом, если есть иерархия.
Вторая вещь — это можно перекрыть эти же меетоды в QTextStream — и сделать сериализацию в виде XML.
Но есть еще одно решение для XML сериализации:
Так вот не очень понравилась идея наследования и сторонних классов, как по мне то удобнее непосредственно перекрыть метод >> и << самого датастрима, гдето так, особенно в коде не уверен, я его не проверял:
QDataStream &operator>>(QDataStream &ds, Object &obj) {
QVariant var;
for(int i=0; i<obj.metaObject()->propertyCount(); ++i) {
if(obj.metaObject()->property(i).isStored(&obj)) {
ds >> var;
obj.metaObject()->property(i).write(&obj, var);
}
}
return ds;
}
* This source code was highlighted with Source Code Highlighter.
Используя перекрытие именно таким образом, можно вообще к метаданным и не грестись, а серилизовать нужные нам поля, даже если они не являются свойствами, плюс можно также серизовать данные данные из приватного класса (если используется Pimp — паттерн). Также возможно воспользоватся полиморфизмом, если есть иерархия.
Вторая вещь — это можно перекрыть эти же меетоды в QTextStream — и сделать сериализацию в виде XML.
Но есть еще одно решение для XML сериализации:
0
englich.wordpress.com/2008/10/23/xml-to-qobjects-qxmltoqobjectcreator/ — но он только в ресече, но можно уже им пользоватся.
Если подумать, то можно еще пару десятков методов наплодить :-), предалагемый автором, один из них.
Удачи автору в «хаке», и добро пожаловать в хабрасообщество.
Если подумать, то можно еще пару десятков методов наплодить :-), предалагемый автором, один из них.
Удачи автору в «хаке», и добро пожаловать в хабрасообщество.
0
Sign up to leave a comment.
Сериализация в Qt через использование MetaObject