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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сериализация данных. как?  (Прочитано 4536 раз)
ieroglif
Гость
« : Сентябрь 21, 2009, 01:34 »

подскажите - как мне собирать данные в пакет, этот пакет превращать в байтовый массив, и отправлять по сети.
а на обратной стороне принять его, разобрать, и получить информацию в удобном виде?

проблемы следующие:
1. в каком виде "хранить" информацию? структуры или классы?
2. как их превращать в байты?
3. как передавать корректно эти байты?

имеются базовые знания сети. имеется работающий удп клиент-сервер, который кидает друг другу всякую чушь (но при этом ещё и получает).
но мне надо кидать не всякую чушь, а что-то получше =)
и вот тут наступил полный ступор с сериализацией.
ничего не понимаю.
уже с неделю бъюсь, а весь инет твердит о бусте.
а можно что-то без буста?
как оно вообще работает?
Записан
fuCtor
Гость
« Ответ #1 : Сентябрь 21, 2009, 06:10 »

Если данные имеют свою структуру  не содержат полей переменной длины, то их можно напрямую передать приведя тип к массиву байт.
Если имеет переменные поля, то просто укладывать определенным образом, например для строк длина и потом следом сами данные.

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

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 21, 2009, 12:31 »

подскажите - как мне собирать данные в пакет, этот пакет превращать в байтовый массив, и отправлять по сети.
а на обратной стороне принять его, разобрать, и получить информацию в удобном виде?
Это то же самое что писать данные в файл/поток. Используйте IFF teg'и

имя tag (тип) - 4 байта
число следующих байт (длина tag) - 4 байта
сами данные  - переменной длины

Tag может содержать вложенные tag'и. Если длину сложно подсчитать, то обычно делают так (псевдокод):
Код:
theStream.writeUInt32('TAG1');       // write tag ID
theStack.push(file.position());         // push file position
theStream.writeUInt32(0);             // write zeo
.....
// write data
...
size_t savedPos = theStack.pop();   
size_t endPos = theStream.position();
theStream.seek(savedPos);
theStream.writeUInt32(endPos - savedPos - 4);   // write data length
theStream.seek(endPos);                                 // back to stream end
Это позволяет записывать данные в любом порядке и контролировать правильность пакета при чтении
Если уж "по всем правилам" то надо писать данные в BIG_ENDIAN, но это можно не делать (становится историей)
Записан
ieroglif
Гость
« Ответ #3 : Сентябрь 21, 2009, 13:02 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 21, 2009, 13:42 »

т.е. суть получается в том, что я создаю сокет, вешаю на него QDataStream, и туда пишу данные?
а при чтении читаю из сокета байт массив, вешаю на него дата-стрим, и уже читаю из него разбирая данные?
да
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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