У меня есть различные структуры, которые необходимо сериализовать и десериализовать, чтобы их можно было транслировать. и получено по 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;
};
Код: Выделить всё
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