У меня есть сервер, получающий данные, которые были сериализованы с использованием форсированной сериализации text_archive. Приходящие данные могут быть одним из следующих MB_BPRequest
или MB_BPResponse
, оба из которых распространяются на MB_BPMessage
.Невозможно десериализовать объект как свой класс, но только как его родительский
Так что у меня этот код:
request_callback(MB_BPRequest);
response_callback(MB_BPResponse);
try {
MB_BPRequest req;
archive >> req;
request_callback_(req);
}
catch (std::exception& e) {
MB_BPResponse resp;
archive >> resp;
response_callback_(resp);
}
и странное дело в том, что он будет только десериализацией архива, если я использую базовый класс:
MB_BPMessage req;
archive >> req;
request_callback_(/*cast somehow*/req);
еще он бросает «входной поток ошибка".
Проблема в том, что я не могу отличить MB_BPMessage
либо MB_BPRequest
, либо MB_BPResponse
, потому что компилятор создает ошибки.
Мне интересно услышать другие подходы к решению этой проблемы.
Проблема в том, что 'MB_BPRequest' и' MB_BPResponse' на самом деле не являются полиморфными - они просто разделяют некоторые функции с базовым классом «MB_BPMessage», но виртуальных методов нет. – Mak
@Mak В этом случае, почему вы ожидаете, что сможете извлечь другой тип ('MB_BPMessage'), чем был сериализован? Это просто ошибка. Вместо этого вы можете использовать 'boost :: variant', если вы _serialize того же типа, что и deserialize_ –
sehe
Извините, если мой вопрос был недостаточно ясным. Когда я сериализую 'MB_BPRequest', я могу только десериализовать его как' MB_BPMessage', иначе я получаю исключение. Я буду смотреть int boost :: variant <>. Спасибо – Mak