Лучшие практики C++: сериализация и абстрактные классы без доступа к библиотекеC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Лучшие практики C++: сериализация и абстрактные классы без доступа к библиотеке

Сообщение Anonymous »

Предисловие: библиотеки сериализации нельзя использовать из-за ограничений в среде разработки.
У меня есть различные структуры, которые необходимо сериализовать и десериализовать, чтобы их можно было транслировать. и получено по UDP.
Я хотел бы определить абстрактный класс для сериализуемых типов, который имеет методы сериализации и десериализации, которые будут реализованы различными типами сообщений. Это то, с чем я работал, но мне это «пахнет». В идеале было бы неплохо сделать Deserialize статическим и вернуть конкретную реализацию Serializable, но виртуальные методы не могут быть статическими:

Код: Выделить всё

class Serializable {
public:
virtual std::size_t Serialize(char* buffer, const unsigned int max_message_size) = 0;
virtual bool Deserialize(const char* buffer, const unsigned int max_message_size) = 0;
};
Абстрактный подкласс UDP может быть следующим:

Код: Выделить всё

template
class UdpMessageBase : public Serializable {
protected:
UDPHeader header; // struct that contains primitive types for metadata about message
T data; // struct that contains message data, subclasses will specialize, see below
bool populated = false;
public:
virtual ~UdpMessageBase() = 0; //abstract class
T getData() {return data;}
UDPHeader getHeader() {return header;}
};
И, наконец, конкретная реализация этого для конкретного сообщения:

Код: Выделить всё

class MySpecificUdpMessage : public UdpMessageBase {
public:
MySpecificUdpMessage() {
initHeader();
}

MySpecificUdpMessage(structForMySpecificUdpMessage data) : data(data) {
initHeader();
populated = true;
}

std::size_t Serialize(char* buffer, const unsigned int max_message_size) {
if (populated) {
// serialize the header and data into buffer to be used by caller
// return total size of serialized data
}
else { // throw error };
}

bool Deserialize(const char* buffer, const unsigned int max_message_size) {
if (populated) {
// throw error
}
else {
// deserialize buffer into header and data of this instance of the object
populated = true;
// return true or false based on success
}
}

private:
void initHeader() {
//set header values specific to this message type
}
};
Пример использования:

Код: Выделить всё

// for outgoing udp message where we have the data
dataForMySpecificUdpMessage someDataToSend; // assume this was passed into this method
char* buffer; // buffer we want to serialize data into
MySpecificUdpMessage messageToSend = MySpecificUdpMessage(someDataToSend);
messageToSend.Serialize(buffer);
SendUDPMessage(buffer); //arbitrary interface that sends the buffer over UDP to client

//for incoming UDP message
char* buffer; //incoming populated data buffer
MySpecificUdpMessage incomingMessage;
incomingMessage.Deserialize(buffer);
messageProcessor(incomingMessage); //arbitrary message processor
// or
dataProcessor(incomingMessage.getData()); //arbitrary data process for the struct
Один альтернативный подход, о котором я подумал, — это класс сериализатора, который имеет кучу статических перегруженных методов сериализации, которые имеют разные реализации на основе переданной структуры. Они просто заполнили бы заголовок на основе этой информации и десериализовали бы данные на основе десериализованного заголовка, но этот класс будет расти с большим количеством сообщений и не будет выглядеть сильно отделенным. Мне просто кажется, что мне не хватает какой-то очевидной лучшей практики.
Будем благодарны за любые советы.

Подробнее здесь: https://stackoverflow.com/questions/787 ... ary-access
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • C# 11. Статические абстрактные члены в интерфейсах через абстрактные классы?
    Anonymous » » в форуме C#
    0 Ответы
    49 Просмотры
    Последнее сообщение Anonymous
  • Статические абстрактные члены в интерфейсах через абстрактные классы?
    Anonymous » » в форуме C#
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Как использовать абстрактные классы в Spring Boot?
    Anonymous » » в форуме JAVA
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Как использовать абстрактные классы в Spring Boot?
    Anonymous » » в форуме JAVA
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Интерфейсы в Python: зачем вообще использовать абстрактные классы? [дубликат]
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»