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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Создать вектор по размеру  (Прочитано 9968 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #15 : Октябрь 05, 2017, 11:39 »

Ну вот в упор не вижу как это связано с моим вопросом  Улыбающийся
QDatastream упаковывает данные в бинарный формат. Нужна информация о именах.
Цитировать
Расскажите чего Вы хотите добиться - только плиз БЕЗ всяких подробностей Вашей системы сериализации, которая уже успела вырасти в изрядного монстра Улыбающийся. Т.е. исходная задача - и все. У меня стойкое впечатление что рулите куда-то явно "не туда" (может я и ошибаюсь)
сериализацию. Желательно попроще, в принципе возможно надо было protobuf использовать.
В моей реализации уже все работает и пользоваться классом удобно, кроме необходимости ручного изменения размера вектора.
как бы сделать function(int size_of_struct, int size, void *p) { (QVector<size_of_struct>*)p->resize(size); }
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #16 : Октябрь 05, 2017, 13:05 »

Вы осознаёте, что с таким вызовом resize происходит вызов конструкторов не совсем того типа (точнее не вызов нужных), под который предназначен контейнер?
Когда-нибудь это повернётся в часы потраченные на отладку.
« Последнее редактирование: Октябрь 05, 2017, 13:07 от __Heaven__ » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Октябрь 05, 2017, 13:11 »

как бы сделать function(int size_of_struct, int size, void *p) { (QVector<size_of_struct>*)p->resize(size); }
Если возникает необходимость в таком (грязном) хаке - значит что-то не так. И надо думать не о том как "дохакать", а о том как сделать правильно, естественно
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #18 : Октябрь 05, 2017, 14:32 »

Вы осознаёте, что с таким вызовом resize происходит вызов конструкторов не совсем того типа (точнее не вызов нужных), под который предназначен контейнер?
POD дата, все равно из ini файла все перезатирается.

Если возникает необходимость в таком (грязном) хаке - значит что-то не так. И надо думать не о том как "дохакать", а о том как сделать правильно, естественно
Ну поэтому я его и не сделал. Виртуальная функция с ручным изменением размера вектора.
А проблема одна, отсутствие в c++ рефлексии. Есть конечно protobuf...
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #19 : Октябрь 05, 2017, 17:06 »

Для организации вменяемой системы сериализации предлагаю посмотреть в сторону boost.

Или можно свести все, например, к такому

Объявление типа
Код
C++ (Qt)
struct SimpleStruct
{
   int m_int;
   double m_double1;
   double m_double2; // например, добавлен при доработке позднее
};
 

Отдельное описание сериализации/десериализации

Код
C++ (Qt)
// перечень версий сериализации (если их требуется вести)
// по умолчанию используется последняя
SERIALIZE_VERSIONS_BEGIN( SimpleStruct )
SERIALIZE_VERSION( Version_1 )
SERIALIZE_VERSION( Version_2 )
SERIALIZE_VERSIONS_END
 
// метод десериализации MyStruct для версии Version_1
// обеспечивает бинарную совместимость с более ранней реализацией
SERIALIZE_LOAD_BEGIN( SimpleStruct, Version_1 )
{
archive
.serialize( value.m_int )
.serialize( value.m_double1 );
}
SERIALIZE_END
 
// метод сериализации/десериализации MyStruct для версии Version_2
// текущий актуальный метод сериализации/десериализации
SERIALIZE_BEGIN( SimpleStruct, Version_2 )
{
archive
.serialize( value.m_int )
.serialize( value.m_double1 )
.serialize( value.m_double2 );
}
SERIALIZE_END
 

Метод сериализации/десериализации единый SERIALIZE_BEGIN .. SERIALIZE_END, но если требуется учесть специфику, то можно использовать взамен пару SERIALIZE_LOAD_BEGIN .. SERIALIZE_END и SERIALIZE_SAVE_BEGIN .. SERIALIZE_END.

А использовать можно так

Код
C++ (Qt)
// Примеры сериализации данных без использования версий
template < typename _Data >
void serializeData ( _Data & data )
{
typedef _Data Data;
// пример десериализации из std::cin
// и сериализации в std::cout
{
typedef ::Serialize::Basic::OStreamArchive< std::ostream > StdOutArchive;
typedef ::Serialize::Basic::IStreamArchive< std::istream > StdInArchive;
Data in_data;
StdInArchive( std::cin )
>> in_data;
StdOutArchive( std::cout )
<< in_data;
}
// пример сериализации в QDebug
{
typedef ::Serialize::Basic::OStreamArchive< QDebug > QDebugArchive;
QDebug stream = qDebug();
QDebugArchive archive( stream );
archive
<< data;
}
// и сериализации в файл с помощью QDataStream
{
typedef ::Serialize::Basic::OStreamArchive< QDataStream > QDataOutArchive;
typedef ::Serialize::Basic::IStreamArchive< QDataStream > QDataInArchive;
QFile file( "test.bin" );
file.open( QFile::WriteOnly );
QDataStream out_stream( &file );
QDataOutArchive out_archive( out_stream );
out_archive
<< data;
file.close();
file.open( QFile::ReadOnly );
QDataStream in_stream( &file );
QDataInArchive in_archive( in_stream );
_Data in_data;
in_archive
>> in_data;
file.close();
}
}
int main ( int, char ** )
{
SimpleStruct my_struct;
serializeData( my_struct );
return 0;
}
 

Реализация пока что проприентарная, полный код выложить не могу, только идеи).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Октябрь 06, 2017, 08:18 »

Для организации вменяемой системы сериализации предлагаю посмотреть в сторону boost.
Может и так, но перед тем как куда-то смотреть - неплохо бы понять "где проблема". Собсно сериализация - работа "не бей лежачего", проходит любая. Только не нужно впадать в манечку "схлопывания", тупое copy/paste здесь часто оказывается лучшим. Да, может и придется написать сотни (тысячи) строк вместо компактного дустовского кода - зато не будет никаких хитросплетений, "отображений" и.т.п. в которые надо мучительно вникать. Что происходит у ТС мы вряд ли узнаем, но впечатление такое что создана "своя система" c  которой теперь приходится постоянно париться. Да-да, "все работает", но только тут одна  противная мелочь, вот подправить ее - и все! Увы, эти мелочи не кончатся никогда.

И кстати. Не раз (и не 2) я полагал примерно так
Цитировать
Та ладно! Все равно будут только POD типы, ну приведусь, сделаю memmove, sizeof, ничего страшного
И всякий раз получал за это  Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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