C++ 无法将对象反序列化为其类,但只能作为其父对象';s
我有一个服务器接收使用boost serialization text_archive序列化的数据。到达的数据可以是以下C++ 无法将对象反序列化为其类,但只能作为其父对象';s,c++,boost,boost-serialization,C++,Boost,Boost Serialization,我有一个服务器接收使用boost serialization text_archive序列化的数据。到达的数据可以是以下MB_BPRequest或MB_BPResponse中的一种,这两种数据都扩展了MB_BPMessage 所以我有这个代码: request_callback(MB_BPRequest); response_callback(MB_BPResponse); try { MB_BPRequest req; archive >> req; request_
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在这种情况下,为什么希望能够提取不同的类型(MB_BPMessage
)而不是连载?那只是个错误。您可能想改用boost::variant
——只要您序列化了与反序列化相同的类型。如果我的问题不够清楚,请原谅。当我序列化MB_BPRequest
时,我只能将其反序列化为MB_BPMessage
,否则我会得到一个异常。我将查看int boost::variant。谢谢,我想我的评论是正确的。您只是没有显示序列化代码,但我敢打赌它序列化了一条MB\BPMessage
。。。如果没有,请在问题()中添加相关代码。下面是一个全面的示例,说明可能出现的错误:。还要注意,不兼容的反序列化甚至可能不会引发错误(在这里,它会默默地返回错误的结果)。这本书仍然可用