Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Есть класс сериализации. Имеет перегруженные операторы 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 заменить.
Что это, и почему нельзя 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'шное завернуть. Голые указатели в крестах - не айс.