1. C++ / Говнокод #18946

    −11

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 01 Ноября 2015

    Комментарии (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'шное завернуть. Голые указатели в крестах - не айс.
          Ответить

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