C++ 无法将对象反序列化为其类,但只能作为其父对象';s

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_

我有一个服务器接收使用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_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
。。。如果没有,请在问题()中添加相关代码。下面是一个全面的示例,说明可能出现的错误:。还要注意,不兼容的反序列化甚至可能不会引发错误(在这里,它会默默地返回错误的结果)。这本书仍然可用