MFC C++应用的最佳 XML 序列化库

Best XML serialization library for a MFC C++ app

本文关键字:XML 序列化 最佳 C++ 应用 MFC      更新时间:2023-10-16

我有一个应用程序,使用 MFC 和 Stingray 库用 C++ 编写。 该应用程序适用于各种大型数据类型,这些数据类型当前都是基于 MFC 文档/视图序列化派生功能序列化的。 我还添加了基于 Stingray 库的 XML 序列化选项,它通过 Microsoft XML SDK 实现 DOM。 虽然易于实现,但性能很糟糕,以至于除了非常小的文档之外,它无法用于任何其他内容。

对于此方案,您还会推荐哪些其他 XML 序列化工具。 我不想要 DOM,因为它似乎是一个内存猪,而且我已经在处理大量的内存数据。 理想情况下,我想要一个快速且易于与 MFC 一起使用的流式解析器。 我目前的领跑者是 expat,它既快速又简单,但需要添加大量逐个类的序列化代码。 人们会推荐的任何其他有效且更容易实施的替代方案吗?

Boost 序列化库支持 XML。该库基本上包括:

  1. 从 MFC 序列化的原则开始,并利用它提供的所有优点。
  2. 解决 MFC 序列化的每一个问题!

与MFC相比,改进之一是对XML的支持。请注意,您不一定控制此序列化的 XML 架构。它使用自己的架构。

这是一个古老的问题。在 1999 年和 2000 年期间,我是开发团队的团队负责人,对世界上最大的软件项目具有最关键的路径依赖关系,这个问题是我当时工作的重点。我确信轮子是由多个工程师发明的,他们不知道其他人已经发明了它。C++中的 XML 数据绑定也是如此。我也发明了它,我已经在各种项目中完善了 10 多年。我有一个解决方案可以解决此处提到的问题以及反复出现的一些其他问题:

  1. XML 更新。这是将 XML 子集重新应用到现有对象模型中的能力。在许多情况下,XML 绑定到索引对象,我们无法承受每次更新的重新索引。

  2. COM 和 CORBA 接口管理。在同样方面,XML 数据绑定可以通过面向对象的实践实现自动化 - 向应用程序层提供该数据的接口对象的实例也可以。

  3. 状态跟踪。应用程序通常需要区分空值和缺失值 - 两者都会创建一个空字符串。这将提供验证以及数据绑定。

源代码使用限制最少的许可证 - 比GPL少。该项目从这里得到支持和管理:

http://www.codeproject.com/KB/XML/XMLFoundation.aspx

现在是2010年,我相信没有其他人会尝试重新发明轮子,因为有一些可供选择。恕我直言 - 这个轮子是最精致和最全面的实施。

享受。

一个好的解决方案是libxml。它为 XML 处理提供轻量级 SAX 解析和数据结构。有几个 DOM 库构建在 libxml 之上。

不幸的是,它是一个 C 库,但C++包装器可用。

几年前,由于您提到的性能问题,我从MSXML切换到libxml。

如果你决定使用 libxml,你还应该看看 libxslt。

我们使用Xerces-C++。它易于设置,性能也足够好,因此我们无需考虑更改。但是,我们不是XML重的。

我确实听了Scott Hanselman(来自Hansel Minutes)的播客,他们讨论了MSXML和XSLT的XML性能。

那么

RapidXML呢,我正在MFC应用程序中使用它,并进行了一些修改以支持带有std::string的UTF-16。到目前为止,我对此非常满意。

gSOAP 工具包自动将本机 C 和C++数据序列化到 XML 或从 XML 序列化,并通过 XML 数据绑定支持完整的 XML 架构规范:

gSOAP SourceForge Project

自 1999 年以来,它已发展成为一个具有代码生成工具和库的重要代码库。它支持许多数据绑定和自定义功能,这对于将 XML 架构类型映射到 C 和 C++ 类型/从 C 和 类型映射尤其重要。它可以序列化任何 C/C++ 类型,也可以序列化 STL 容器、容器模板和循环数据结构。它已被用于 W3C 数据绑定模式工作组(多年来架构模式覆盖率达到 100% 成功)。有一个活跃的开源用户群,gSOAP 开发功能已被许多工业项目和财富 100 强公司用于开发 SOAP/XML 基础结构。

这是游戏的后期,我只想提一下我们也使用 LIBXML。它坚固可靠,运行良好。有点太低级了,你会想在其功能之上构建一些包装器。

例如,您将获得不同的函数返回序列,具体取决于您是否具有此序列:

<tag attribute="value"/>

或者这个:

<tag attribute="value"> </tag>
有时

你可能想要那个,有时你不在乎。

我们使用TinyXML来满足我们所有的XML需求,无论是MFC还是直接C++。

http://sourceforge.net/projects/tinyxml