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

标签 c++ design-patterns serialization interface

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

两种选择:

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

问:

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

最佳答案

实际情况是,您所建议的两种方法几乎没有什么区别。但是您需要考虑许多重要的实现权衡。包括:

  1. 序列化格式应该是人类可读的还是二进制的。 CSV、XML、JSON、YAML 可能是人类可读的。二进制可以是 ASN.1、自定义格式、序列化库的输出。
  2. 对于 future 的变化,格式的可扩展性应该如何。您需要文件格式版本号吗?您应该允许任意字段吗?
  3. 它是否需要基于标准,将来其他应用程序是否也会参与此信息交换。
  4. 交换需要有多安全。是否应使用 SSL/TLS,是否应加密数据等。
  5. 交换所需的可靠性和/或性能如何。 XML 附带 XSD 用于验证数据,但解析速度不如其他格式快。如果您需要可靠的交付,您应该使用消息队列(ActiveMQ、MSMQ 等)吗?
  6. 二进制文件将如何共享数据:监视文件夹、内存映射文件、命名管道、套接字、消息队列、boost::asio、Thrift、XML RPC、HTTP、SOAP、REST 等

无论您是使用 boost::serialization 或 google protocol buffers 序列化一个类,还是您说编写手动 XML DOM 代码来读取和写入数据,都是您设计中更重要的考虑因素中的一个小细节。但是,根据我的经验,如果您可以灵活地使用自定义数据格式,那么与自行开发的解决方案相比,使用序列化代码更易于维护、性能更好并且质量问题更少。

关于c++ - (De/)序列化作为 C++ 中基于文件的数据交换的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21825787/

相关文章:

c++ - 没有 mysql_config 的 MariaDB C 连接器

java工厂和观察者模式

java - Gson 注释不适用于我的模型。

c++ - C++ 中的 CPU throttle

c++ - 创建静态库并使用 premake 链接到它

c# - 从枚举值中获取字符串的优雅方法?

java - 构建器模式和扩展自身的泛型类型

java - 实现不同存储策略的模式

serialization - Protocol Buffer 中的字典

使用 Jackson 序列化 JSON 的 Java 类实现