- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
//Для сервера
int PacketCoderDecoder::CodeDataUsersList(const QList<User>& users, char*& buffer)
{
//Этот карнавал нужен, чтобы не отправлять пользовательские пароли
//Определяем размер буфера
int size = sizeof(PacketTypes) + sizeof(int);
for (int i = 0;i < users.size(); i++)
{
User u = users[i];
u.Password = "";
size += Serializers::Sizeof(u);
}
//Отправляем
int pos;
buffer = new char[size];
PacketTypes type = DATA_USERS_LIST;
pos = Serializers::Serialize(type, buffer);
for (int i = 0; i < users.size(); i++)
{
User u = users[i];
u.Password = "";
pos += Serializers::Serialize(type, buffer + pos);
}
return size;
}
Из моей же лабы - чат на виндовых каналах. Некогда исправлять, похуй, пляшем.
Что это, и почему нельзя Sizeof(u)*users.size()?
Т.е. для универсальной сериализации достаточно перегрузить QDataStream &operator << (QDataStream &, T); для std::is_trivially_copyable<T>() и своих нетривиальных классов.
Зачем? В буфер этот самый int не пишут (предполагалось, что в нём будет количество юзеров?)... Или я что-то упускаю?
> pos = Serializers::Serialize(type, buffer);
> pos += Serializers::Serialize(type, buffer + pos);
А я бы сериализатору сделал стримоподобный интерфейс: пусть сам хранит свои буфер и позицию. Не барское это дело, буфера выделять да pos увеличивать. А уж освобождать память - и подавно ;)
> Есть класс сериализации.
QDataStream чем-то не устроил?
Да, он там может прямо из/в QByteArray данные стримить. В конструкторы глянь.
> списки лучше на std::vector заменить
Ну и буфер во что-нибудь RAII'шное завернуть. Голые указатели в крестах - не айс.