Я делал это бесчисленное количество раз раньше: это очень распространенный сценарий. Есть несколько вещей, которые я практически всегда делаю.
Не беспокойтесь о том, чтобы сделать его наиболее эффективным.
Если мы действительно тратим много времени на упаковку и распаковку пакетов, мы всегда можем изменить его, чтобы быть более эффективным. Пока я не сталкивался с ситуацией, когда мне еще нужно было, я не реализовал сетевые маршрутизаторы!
В то время как использование структур/союзов является наиболее эффективным подходом во время выполнения, оно имеет ряд осложнений: убеждение вашего компилятора упаковать структуры/союзы в соответствие с октетной структурой пакетов, которые вам нужны, работать, чтобы избежать проблемы выравнивания и согласованности, а также отсутствие безопасности, поскольку нет возможности или мало возможностей для проведения проверок здравомыслия при сборке отладки.
Я часто ветер с архитектурой, включая следующие виды вещей:
- пакета, базовый класс. Любые общие поля данных доступны (но не изменяются).Если данные не хранятся в упакованном формате, то есть виртуальная функция, которая будет создавать упакованный пакет.
- Несколько классов представления для определенных типов пакетов, полученных из общего типа пакета. Если мы используем функцию упаковки, то каждый класс представления должен ее реализовать.
- Все, что может быть выведено из определенного типа класса представления (то есть идентификатор типа пакета из общего поля данных), рассматривается как часть инициализации и в остальном не может быть изменено.
- Каждый класс презентации может быть создан из распакованного пакета или будет изящно сбой, если пакетные данные недействительны для этого типа. Это может быть завершено на заводе для удобства.
- Если у нас нет доступного RTTI, мы можем получить «RTTI от бедного человека», используя идентификатор пакета, чтобы определить, какой именно класс презентации действительно является объектом.
Во всех случаях это возможно (даже если они предназначены только для отладочных сборников), чтобы убедиться в том, что каждое изменяемое поле устанавливается на значение разумного значения. Хотя это может показаться большой работой, очень сложно иметь неверно отформатированный пакет, содержимое предварительно упакованных пакетов может быть легко проверено глазом с помощью отладчика (так как это все в обычных переменных формата платформы).
Если нам нужно реализовать более эффективную схему хранения, это тоже можно обернуть в эту абстракцию с небольшими дополнительными затратами на производительность.
Я был уверен, что видел почти дубликат этого, но я не мог его выкопать. Ответы в соответствующей ссылке не очень хорошие, как здесь, но все же ... – dmckee