Russian Qt Forum
Сентябрь 28, 2024, 20:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 3 4 [5] 6 7 8   Вниз
  Печать  
Автор Тема: Сериализация (как сделать поудобнее)  (Прочитано 47584 раз)
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #60 : Февраль 07, 2013, 15:58 »

Все структуры взаимосвязаны.
Фактически они являются нодами огромнейшей системы. Каждая нода может ссылаться на данные, на другую ноду, быть объединённой с другой нодой. Имеются ноды различных типов, начиная от физ устройства, заканчивая виртуальными узлами. Собственно получается этакий чоООООрный круг. Что на самом деле не круг, а граф связей между ними Веселый

Да, ссылок может быть несколько Веселый

Если коротко, то способ с переопределением операторов для QDataStream не будет работать для полиморфных классов. Например:
Код
C++ (Qt)
class A {};
class B : public A {};
 
QDataStream & operator<< (QDataStream& stream, const A& a);
QDataStream & operator>> (QDataStream& stream, A& a);
 
QDataStream & operator<< (QDataStream& stream, const B& b);
QDataStream & operator>> (QDataStream& stream, B& b);
 
main
{
 A* b = new B();
 
QDataStream out(&file);
out << *b; // Call QDataStream & operator<< (QDataStream& stream, A& a);
}
будет записана только часть класса А, поля В сохранены не будут. Потому что используемый шаблон выбирается в compile-time, и компилятор не знает, какой фактически объект будет в run-time. Если у вас есть дочерние ноды, они создаются динамически и в compile-time их конкретный тип не известен, то Вас ожидают такие вот грабли Улыбающийся. И есть еще много других Веселый.

В способе буста тоже не все так безоблачно, стоить посмотреть Pointers to Objects of Derived Classes. Я о таком подозревал, и когда увидел это, стало еще тоскливее...
Записан

Пока сам не сделаешь...
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #61 : Февраль 07, 2013, 16:09 »

Так почему бы не сказать проще "используй сериализацию буста, там давно за тебя все сделали". Однако не все спешат это делать - хотя сериализация есть у каждого. Был слушок что там проблемы с версиями - правда никаких подробностей не знаю. Да и просто перелопатить с Archive множество живых классов как-то не тянет. Да, в Qt кое-чего нет, так что, сразу привлекать др либу? Может и свои решения будут неплохи (или такая мысль не допускается?  Улыбающийся)
Выше уже сказали, что никто не заставляет использовать, а посмотреть на реализацию вполне стоит Улыбающийся.

Если бы буст был так хорош, и его бы использовали в Qt, я бы тоже им пользовался безоговорочно. Но разработчики Qt не используют его, более того, изобретают свои велосипеды, взять хоты бы их контейнеры QVector, QList и т.п. Хотя, казалось бы, бери хоть из std, хоть из буста. Велосипеды Qt мне нравятся намного больше, чем другие. Поэтому я пользуюсь Qt и добавляю туда свои запчасти, и не использую буст. Но это не значит, что нельзя в бусте подглядывать интересные и полезные моменты Улыбающийся.
Записан

Пока сам не сделаешь...
Bepec
Гость
« Ответ #62 : Февраль 07, 2013, 16:10 »

Как бы это ни было, но оно есть и сериализация там монструозная. Причём даже дерева не построить - будут конфликты Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #63 : Февраль 07, 2013, 16:18 »

Если бы буст был так хорош, и его бы использовали в Qt,
Ну в обще-то буст очень хорошо, очень-очень. А не используют его в Qt совсем по другим причинам. Велосипеды в Qt свои, потому что в те времена, когда его начинали разрабатывать не было даже нормальной поддержки строк. Плюс Тролли хотели полной автономности и лишние зависимости были просто не нужны.

И да, если когда нибудь, не дай Бог конечно, вам придется писать софт без Qt обратите внимание на буст. Он многое предоставляет.
« Последнее редактирование: Февраль 07, 2013, 16:22 от Old » Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #64 : Февраль 07, 2013, 16:31 »

Плюс Тролли хотели полной автономности и лишние зависимости были просто не нужны.
У меня примерно такие же аргументы были. И плюс, например, по контейнерам надо было выбирать. Все-таки чем-то одним надо пользоваться.

И да, если когда нибудь, не дай Бог конечно, вам придется писать софт без Qt обратите внимание на буст. Он многое предоставляет.
Смотрел туда одно время... На довольно низком уровне, для кроссплатформенности, похоже лучше и не найдешь библиотеки. Но хотелось уровень повыше и удобства, поэтому победил Qt Веселый. И буст таскать с собой не захотелось.
Записан

Пока сам не сделаешь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #65 : Февраль 07, 2013, 17:00 »

И буст таскать с собой не захотелось.
Большинство бустовских библиотек просто разворачиваются в коде, т.е. таскать с бинарником разделяемые библиотеки не нужно. К тому же его всегда можно собрать статически.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #66 : Февраль 07, 2013, 17:21 »

А как насчет того чтобы вернуться к теме? Улыбающийся  Я согласен со всем что сказали ViTech и Old, но согласитесь, конструктивных решений это никак не прибавляет. Что мы имеем? Ну мой (сопливый) вариант, систему sergek (которой пока не понял) и... что еще?

- ничего не делать, перетерпеть как-нибудь (ручками)
- ах как хорош буст, но ведь все имеет свои стороны (и пошла философия)
- мутные предложения сделать какой-то оператор (хз какой  Непонимающий) и цитирование Вереса (в начале темы)

Негусто. Или я что-то упустил?
Записан
Bepec
Гость
« Ответ #67 : Февраль 07, 2013, 17:34 »

Плохо читаете Улыбающийся

1) Сериализация с использованием шаблонов (Igors)
2) Строковые идентификаторы для каждой переменной (sergeich)
3) Объединение включающее структуру и массив байт (данные всегда находятся в виде массива байтов, ничего сериализовать и десериализовывать не надо) (Bepec)
4) Переопределение операторов << и >> с простейшим упихиванием всего в QDataStream  (Bepec)
5) Использование готовых библиотек сериализации (boost, s11n). Правда описывать сериализатор и десериализатор тоже нужно Улыбающийся
6) Написание своего сериализатора и десериализатора для каждого объекта. На выходе получаем стандартный контейнер (alexis)
7) Написание отдельных сериализаторов для каждого алгоритма сериализации (XML) и подключение их по мере необходимости (ViTech)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #68 : Февраль 07, 2013, 17:46 »

3) Объединение включающее структуру и массив байт (данные всегда находятся в виде массива байтов, ничего сериализовать и десериализовывать не надо) (Bepec)
От этого меня отучили еще когда понадобилось гонять данные между  PPC и Intel. Причем понимание что так делать плохо приходит быстро и навсегда Улыбающийся По поводу остального
Цитировать
Вы сказали много интересного и нового. Но интересное не ново, а новое не интересно



 
Записан
alexis031182
Гость
« Ответ #69 : Февраль 07, 2013, 18:16 »

Получается, Верес победил. У него больше всего вариантов Улыбающийся
Записан
Bepec
Гость
« Ответ #70 : Февраль 07, 2013, 18:24 »

В любом случае всё разбивается на три кучки:

В первой простота и понятность кода. Т.е. будет ясно каждому более-менее знакомому с языком, можно поправить без особых усилий.
Цитировать
3) Объединение включающее структуру и массив байт (данные всегда находятся в виде массива байтов, ничего сериализовать и десериализовывать не надо) (Bepec)
4) Переопределение операторов << и >> с простейшим упихиванием всего в QDataStream  (Bepec)
6) Написание своего сериализатора и десериализатора для каждого объекта. На выходе получаем стандартный контейнер (alexis)

Во второй использование сторонних библиотек - там всё продумали за нас, вот только не гарантируют что новая версия библиотек будет поддерживать старые функции и типы сериализации (буст тому подтверждение)
Цитировать
5) Использование готовых библиотек сериализации (boost, s11n). Правда описывать сериализатор и десериализатор тоже нужно Улыбающийся

В третьей группе у нас находится написание собственных сериализаторов с использованием шаблонов, отдельных файлов заголовков для сериализации, строковых идентификаторов.
Пользоваться и создавать можно, разбор и правка может вызвать затруднения
Цитировать
1) Сериализация с использованием шаблонов (Igors)
2) Строковые идентификаторы для каждой переменной (sergeich)
7) Написание отдельных сериализаторов для каждого алгоритма сериализации (XML) и подключение их по мере необходимости (ViTech)

У меня только два мнения Улыбающийся
Первое - это метод Igors (т.к. шаблоны действительно сильно упрощают код, но я ими пока слабо работаю, так что на будущее).
Второе - первая группа из-за простоты её поддержки/правки/добавления нового функционала и возможности автоматизирования её создания.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #71 : Февраль 07, 2013, 18:26 »

Негусто. Или я что-то упустил?

Есть одно маленькое упущение: чтобы получить конструктивное решение, надо описать конструктивное задание Улыбающийся. Потому как нет одного универсального метода, который ко всем случаям оптимально подойдет.

Поэтому повторюсь:
Цитировать
« Последнее редактирование: Февраль 07, 2013, 18:29 от ViTech » Записан

Пока сам не сделаешь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #72 : Февраль 07, 2013, 18:32 »

Негусто. Или я что-то упустил?
Хорошо, давайте добавим немного кода:
Код
C++ (Qt)
#ifndef serialize_h
#define serialize_h
 
#include <QDataStream>
 
class archive
{
public:
enum rw_mode { read, write };
 
virtual ~archive() {};
virtual rw_mode mode() const = 0;
};
 
class iarchive : public archive
{
public:
rw_mode mode() const { return read; }
};
 
class oarchive : public archive
{
public:
rw_mode mode() const { return write; }
};
 
class qds_iarchive : public iarchive
{
public:
qds_iarchive( QIODevice *dev ) : m_stream( dev ) {}
 
template<typename T>
qds_iarchive &operator&( T &data )
{
m_stream >> data;
return *this;
}
 
private:
QDataStream m_stream;
};
 
class qds_oarchive : public iarchive
{
public:
qds_oarchive( QIODevice *dev ) : m_stream( dev ) {}
 
template<typename T>
qds_oarchive &operator&( const T &data )
{
m_stream << data;
return *this;
}
 
private:
QDataStream m_stream;
};
 
#endif // serialize_h
 

Код
C++ (Qt)
#include <QCoreApplication>
#include <QFile>
#include <QDebug>
#include "serialize.h"
 
int main( int argc, char *argv[] )
{
QCoreApplication app( argc, argv );
 
{
QFile file( "test.dat" );
if( !file.open( QIODevice::WriteOnly ) )
{
qWarning() << "File open error (write)";
return 1;
}
 
qint8  a = 0x10;
qint16 b = 0x20;
qint32 c = 0x30;
 
qds_oarchive os( &file );
os & a;
os & b;
os & c;
}
 
{
QFile file( "test.dat" );
if( !file.open( QIODevice::ReadOnly ) )
{
qWarning() << "File open error (read)";
return 1;
}
 
qint8  a;
qint16 b;
qint32 c;
 
qds_iarchive is( &file );
is & a;
is & b;
is & c;
 
qDebug() << hex << a << b << c;
}
 
return 0;
}
 
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #73 : Февраль 07, 2013, 20:50 »

Хорошо, давайте добавим немного кода:
Код
C++ (Qt)
qDebug() << hex << a << b << c;
 
а это что: qDebug() << hex << a << b << c; ??
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #74 : Февраль 07, 2013, 20:56 »

а это что: qDebug() << hex << a << b << c; ??
Манипулятор. Для печати в 16-ричной системе.
Записан
Страниц: 1 ... 3 4 [5] 6 7 8   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.277 секунд. Запросов: 23.