Всем привет.
Имеется некий клиент-серверный проект. Для обмена данными между клиентом и сервером применяется некий бинарный протокол обмена.
Преобразование структур данных в байты осуществляется примерно следующим образом: сперва высчитывается, сколько структура займёт байт, после чего конструируется QByteArray заданного размера и в этот самый QByteArray через memcpy вставляются поля структуры. В случае десериализации соответственно, обратно через memcpy заполняются поля структуры.
Из минусов такого подхода могу отметить, что иногда из-за невнимательности порождаются ошибки, от которых программа может упасть (выход за границы), это в лучшем случае. В худшем выхода не будет (или программа не упадёт), но данные будут не совсем верные и это обнаружится не сразу. Портянки из кучи memcpy и расчёта офсета в какой-то момент надоело писать, зафигачил лямбды, в которые всё это спрятал и код соответствующих методов сократился раза в два, но осадочек всё равно от кода расчёта потребного объёма имеется (может и это как-то можно автоматизировать, позволяют ли средства C++ в рантайме проходить по полям любой структуры?).
В какой-то момент возникает вопрос, а надо ли так запариваться, есть же QDatastream, через который можно делать то же самое, да ещё и без падения программы, если прокосячился и происходит выход за границы. Единственный аргумент против, по сути, большее количество аллокаций при работе через QDatastream, но что значит больше, если у меня размеры структур в пределах нескольких килобайт (и это пара штук, остальные в пределах сотен байт), вроде как и мелочи это. Ну отработает оно не за миллисекунду, а за 10, вроде как и пофигу.
Может кто поделиться опытом, есть ли смысл запариваться с подходом, который применяется сейчас (и потенциально плодит ошибки, которые не всегда сразу видно) или же пусть это дело фигачится через QDatastream, хоть и «медленнее», но зато не валится в случае чего?