序列化一个子类,然后将其反序列化回子类

时间:2015-03-27 10:14:06

标签: c++ serialization polymorphism deserialization

问题介绍

我希望序列化Message实例以通过网络发送它,然后接收它,并将数据反序列化为相同的Message实例,这不是问题。

问题是我希望其他人能够继承Message类,但反序列化变得困难,因为我不知道序列化数据来自哪个子类,所以我不# 39;不知道要使用哪种反序列化功能。

序列化更容易,因为我可以创建一个子类必须实现的抽象serlialize方法。这样,在运行时,我可以调用Message::serialize()

在序列化发生之前,我所拥有的只是指向Message实例的指针。在反序列化之后,我希望有一个指向Message实例的指针(不是指向Message类的子类的指针)。

我想出了一些解决方案,但我并不特别喜欢它们,因为它们看起来很难维护。如果必须,我会使用它们,但我想知道是否还有其他方法。

我在C++中执行此操作。

我在尝试解决更大问题时遇到的问题

1。确定序列化数据的子类

我需要确定序列化数据的子类,以确定要使用哪个反序列化函数。 以下是我到目前为止所考虑的可能解决方案:

  • 序列化协议; 我可以使第一个字节成为一个可以作为类型标识符的字符,这样我就可以确定它是哪个子类。
    • 这让我想知道从哪里获得这样一个独特的标识符?有没有办法在C ++中获取子类的唯一标识符? perhapse,类似于Java getCanonicalName()

2。执行反序列化

在确定Message实例所属的子类之后,我需要执行deserilization函数,但我的直接解决方案是凌乱的。 以下是我到目前为止所考虑的一些可能的解决方案,我希望改进,并避免其他方式:

  • Big switch语句; 我会识别消息的子类,然后切换子类类型,并为执行反序列化的每个子类创建一个大小写。 我想避免这种做法有几个原因:
    • 每当一个子类Message时,他们就必须在switch语句中添加一个case,这是不可取的,因为对于那些子类Message来说,switch语句的存在并不明显。
    • 它可能会变成一个非常大的switch语句,从而降低了可读性。
  • 构建一个将子类ID映射到反序列化函数的映射; Message类的每个子类的条目将插入到映射中,因此在收到Message后来自网络的实例,并确定子类类型,我可以在地图中查找反序列化函数,并调用它。 此解决方案存在问题:
    • 我无法想出一种方法来强制Message的子类在编译时插入一个条目。

感谢您阅读所有内容。

0 个答案:

没有答案