Кресты / Говнокод #18946 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 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;
}

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

Запостил: Mar95 Mar95, (Updated )

Комментарии (6) RSS

  • >size += Serializers::Sizeof(u);
    Что это, и почему нельзя Sizeof(u)*users.size()?
    Ответить
    • Есть класс сериализации. Имеет перегруженные операторы Sizeof, Serialize, Deserialize для разных типов (несколько моих классов, строка, шаблонный список, int, bool). Нужно для единообразия. Т.к есть шаблонная функция сериализации QList<T>, то если если бы я в ней написал просто sizeof(T), можно было бы сериализовать лишь простые данные и структуры\классы без указателей (все списки, строки идут лесом). А сейчас я могу сериализовать список чего угодно - список строк, интов, списков списков списков строк, если захочу.
      Ответить
      • Открою маленькую тайну: есть такая штука, как QDataStream, и она умеет сериализовывать всё Qt-шное (хоть мапы списков строк).

        Т.е. для универсальной сериализации достаточно перегрузить QDataStream &operator << (QDataStream &, T); для std::is_trivially_copyable<T>() и своих нетривиальных классов.
        Ответить
  • > + sizeof(int)
    Зачем? В буфер этот самый int не пишут (предполагалось, что в нём будет количество юзеров?)... Или я что-то упускаю?

    > pos = Serializers::Serialize(type, buffer);
    > pos += Serializers::Serialize(type, buffer + pos);
    А я бы сериализатору сделал стримоподобный интерфейс: пусть сам хранит свои буфер и позицию. Не барское это дело, буфера выделять да pos увеличивать. А уж освобождать память - и подавно 😉

    > Есть класс сериализации.
    QDataStream чем-то не устроил?
    Ответить
    • Хорошая мысль, насчет стримоподобный интерфейс, спасибо. А из QDataStream можно массив байт получить? Быстрый просмотр доков не дал ответа. Хотя, я решил избавиться от Qt, оказался не нужен, списки лучше на std::vector заменить.
      Ответить
      • > можно массив байт получить
        Да, он там может прямо из/в QByteArray данные стримить. В конструкторы глянь.

        > списки лучше на std::vector заменить
        Ну и буфер во что-нибудь RAII'шное завернуть. Голые указатели в крестах - не айс.
        Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8