2015-07-13 5 views
1

У меня есть сервер, получающий данные, которые были сериализованы с использованием форсированной сериализации 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, потому что компилятор создает ошибки.

Мне интересно услышать другие подходы к решению этой проблемы.

ответ

1

Вы можете (де) сериализовать полиморфные типы с помощью указателя. См

В частности, если вы действительно должны сериализовать это с помощью ссылки, вы будете иметь дело с семантикой собственности вручную:

Мы рассматриваем эти вопросы путем сериализации ссылок, как если бы они были указателями.

+0

Проблема в том, что 'MB_BPRequest' и' MB_BPResponse' на самом деле не являются полиморфными - они просто разделяют некоторые функции с базовым классом «MB_BPMessage», но виртуальных методов нет. – Mak

+0

@Mak В этом случае, почему вы ожидаете, что сможете извлечь другой тип ('MB_BPMessage'), чем был сериализован? Это просто ошибка. Вместо этого вы можете использовать 'boost :: variant ', если вы _serialize того же типа, что и deserialize_ – sehe

+0

Извините, если мой вопрос был недостаточно ясным. Когда я сериализую 'MB_BPRequest', я могу только десериализовать его как' MB_BPMessage', иначе я получаю исключение. Я буду смотреть int boost :: variant <>. Спасибо – Mak

 Смежные вопросы

  • Нет связанных вопросов^_^