Pull to refresh

Comments 12

Добавить в начале еще имя\ID сериализуемого класса + сделать «менеджер» таких классов, по типу qRegisterMetaType и можно принимая поток на вход на выходе иметь готовые экземпляры класса без дополнительных телодвижений. Удобно если классы имеют общий интерфейс.
Есть идеи для модификации/апгрейцда конструкции:
1. Поток поддерживаеит передачу информацию о версии. Внедрить контроль версии.
2. В metapropertyu имя класса и так автоматически введено. Поэтому — передается. Соответственно наша задача — лишбь его проконтролировать…
3.Есть идея как обойти проблему того что QObject нрельзщя напрямукю сделать свойством (Q_DISABLE_COPY в базовом классе QObject). Есть одна идейка основанная на реализации конструктора копирования и регистрации метатипа.
4.Касаемо непосредственно вашей идеи — имел некоторые грабли с автоматическим конструированием объектов через QMetaObject::construct. Не всегда дефолтный конструктор отрабатывал как хотелось как результат получали вылеты. Пока что — разбираюсь с тем как корректно создавать экземпляры объектов со свойствами через метатип.

Надеюсь завтра часть информации выяснить и дополнить статью.

P.S. не бейте сильно Qt я занялся относительно недавно, всего пару месяцев. До этого шарпом занимался, поэтому нюансы объектной системы могу и не знать :)
В чем заключалась некоректность?

Хотя самый правильный способ использовать newInstance. Надо будет поэкспериментировать.

Пока только использовал метаобъекты для автоматической регистрации «сервисов» в XMLRPC сервере. Надо будет оформить топик наверно, допилить лишь только код )
Спасибо за ссылку. Как мне кажется, Я просто не ставил Q_INVOKABLE для конструкторов, поэтому при их вызове всё «рушилось». Надо будет проверить, и если всё ок, статья обретет новый и законченный смысл, так как останется лишь ограничение по тому что если используем указатель в виде свойста — его на выходе и получим. С указателями надо будет както «допиливать».
UFO just landed and posted this here
предЫстория, а в по содержанию — познавательно, спасибо.
Спасибо. Поправил. А также добавил пункты про свойства-объекты и возню с ними. ГеморрояРаботы много, зато эффект налицйо — польностью рабочая системка, где можно сериалиазовать объект «от корней до самых кончиков»
Интересненько, вот думаю, насколько можно выиграть во времени загрузки, если вместо инициализации сложных объектов, просто их сериализовать и сбрасывать на диск, а потом десериализовать
По времени не знаю, думаю ради только этого игра свеч может и не стоит (хотя… хависит от кол-ва объектов различных класов). В а универсальности сброса — хоть на диск, хоть в инет через поток, хоть просто в память… Да мало ли применений стандартному потоку придумать можно…
У меня идея была сбросить контакт лист qutIMа, но я сейчас тестю его новую реинкарнацию и по ощущениям он почти мгновенно генерируется. Хотя в 0.2 он тормозил, от этого такие мысли и возникали. А больше у нас наверное и нечего такого крупного сериализовать. Только если всё сразу целиком :)
Хоть и дал инвайт автору, но со статьей немножко не согласен (основная цель — привлеч Qt-шников в хабл :-) даешь нас больше :-) )
Так вот не очень понравилась идея наследования и сторонних классов, как по мне то удобнее непосредственно перекрыть метод >> и << самого датастрима, гдето так, особенно в коде не уверен, я его не проверял:

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 сериализации:

englich.wordpress.com/2008/10/23/xml-to-qobjects-qxmltoqobjectcreator/ — но он только в ресече, но можно уже им пользоватся.

Если подумать, то можно еще пару десятков методов наплодить :-), предалагемый автором, один из них.

Удачи автору в «хаке», и добро пожаловать в хабрасообщество.
Sign up to leave a comment.

Articles