(De /)序列化作为C ++中基于文件的数据交换的接口

时间:2014-02-17 09:56:05

标签: c++ design-patterns serialization interface

我试图找到对正确使用序列化进行数据传输的一般性理解。想象一下,我们有两个二进制文件。每个二进制文件都有一些内部数据表示符合其内部使用模型,并且表示形式因二进制文件而异。现在我们想将一些数据从一个二进制文件传递给另一个二进制文件。

两个选项:

  • 使用具有系列化/反序列化方法的辅助类。该类针对存储进行了优化,并将所有文件表示逻辑保存在一个位置。
  • 分别使用每个二进制文件内部结构的标准化格式的自定义读/写。这样可以避免创建辅助类实例和双重复制的开销。

问:

  • 为了理解特定情况下两种方法的适用性,我需要做些什么推测?
  • 是否存在一种混合解决方案的模式,以保留两者的优点?

1 个答案:

答案 0 :(得分:1)

实际情况是,很难区分您建议的两种方法。但是,您需要考虑许多重要的实施权衡。包括:

  1. 序列化格式应该是人类可读的还是二进制的。人类可读的CSV,XML,JSON,YAML。二进制可以是ASN.1,自定义格式,从序列化库输出。
  2. 格式对于未来的变化应该具有多大的可扩展性。您需要文件格式版本号吗?你应该允许任意字段吗?
  3. 是否需要基于标准,未来的其他应用程序也将参与此信息交换。
  4. 交换需要多么安全。如果它使用SSL / TLS,数据是否应加密等。
  5. 交换需要多么可靠和/或高效。 XML附带XSD用于验证数据,但解析速度不如其他格式快。如果您需要可靠的交付,您应该使用消息队列(ActiveMQ,MSMQ等)吗?
  6. 二进制文件如何共享数据:监视文件夹,内存映射文件,命名管道,套接字,消息队列,boost :: asio,Thrift,XML RPC,HTTP,SOAP,REST等
  7. 是否使用say boost :: serialization或google协议缓冲区序列化类,或者您是否说编写手动XML DOM代码来读取和写入数据是设计中更重要的注意事项的较小细节。但是,根据我的经验,如果您可以灵活地使用自定义数据格式,则序列化代码更易于维护,性能更好,质量问题比本土解决方案更少。