oop — сериализация пакетов в переполнении стека

У меня есть проект, который выполняет сериализацию пакетов нескольких различных типов (Packet1, Packet2…). Все они расширяют PacketHeader класс и делает свою собственную сериализацию

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

Есть ли чище и больше ООП & C ++ способ для сериализации (без сторонней библиотеки)?

class PacketHeader {
uint8_t type;
uint32_t id;
uint32_t seqNum;

virtual void serialize(uint8_t *buf, size_t size) {
int offset = 0;
PacketHeader n;
n.type = type;
n.id = htonl(id);
n.seqNum = htonl(seqNum);
memcpy(buf + offset, &(n.type), sizeof(n.type));
offset += sizeof(n.type);
memcpy(buf + offset, &(n.id), sizeof(n.id));
offset += sizeof(n.id);
memcpy(buf + offset, &n.seqNum, sizeof(n.seqNum));
offset += sizeof(n.seqNum);
}
}

class Packet1 : public PacketHeader {
uint32_t payload;

virtual void serialize(uint8_t *buf, size_t size) {
int offset = PacketHeader::size();
PacketHeader::serialize(buf, size);
memcpy(buf + offset, &n.payload, sizeof(n.payload));
offset += sizeof(n.payload);
}
}

3

Решение

Выполнение сериализации изначально для структур и классов с элементами данных требует, чтобы вы передавали информацию о смещении, размере и типе для каждого элемента в сериализатор. Это источник «грязного» аспекта, и вы не можете избежать его, независимо от того, насколько элегантен ваш дизайн.

Есть несколько вспомогательных библиотек, которые могут предоставить некоторую структуру, но они, как правило, просто синтаксическая конфета, и их все еще довольно сложно поддерживать по мере роста количества типов сообщений.

Вместо этого я бы порекомендовал взглянуть на системы, которые предоставляют словари — объекты данных ключ / значение, а не на использование собственных элементов данных структуры / класса C ++. Некоторые используют стандартные форматы сериализации, такие как JSON. JSONCPP — очень уважаемый пакет, который делает это: http://jsoncpp.sourceforge.net/

Преимущественно они обеспечивают преимущество, заключающееся в том, что программная система будет лучше масштабироваться по мере роста и не станет головной болью экспоненциального обслуживания.

Если желательна двоичная сериализация, обратите внимание на BSON, MessagePack, Google Protocol Buffers и Apache Thrift. Все они предлагают библиотеки или привязки для C ++.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]