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

Posted

技术标签:

【中文标题】MFC C++ 应用程序的最佳 XML 序列化库【英文标题】:Best XML serialization library for a MFC C++ app 【发布时间】:2008-10-22 11:11:41 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

Boost Serialization 库支持 XML。这个库主要包含在:

    从 MFC 序列化的原理出发,把它提供的所有好东西都拿来。 解决MFC序列化的每一个问题!

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

【讨论】:

boost 序列化看起来很合适,很可能是远离 MFC 的良好第一步。【参考方案2】:

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

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

    COM 和 CORBA 接口管理。同样地,XML 数据绑定可以通过面向对象的实践实现自动化——向应用层提供数据的接口对象的实例也可以。

    状态跟踪。应用程序通常需要区分空值和缺失值——两者都创建一个空字符串。这与数据绑定一起提供验证。

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

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

现在是 2010 年,我相信没有其他人会尝试重新发明***,因为有几个可供选择。恕我直言 - 这个***是可用的最完美和最全面的实现。

享受。

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

LibXML 一路走好!不要忘记它的姊妹组件 LibXSLT。【参考方案4】:

我们使用Xerces-C++。它很容易设置,性能也足够好,所以我们不需要考虑改变。但是,我们并不重 XML。

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

【讨论】:

【参考方案5】:

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

【讨论】:

std::string 应该是 std::wstring,抱歉打错了。 -tomgee【参考方案6】:

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

gSOAP SourceForge Project

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

【讨论】:

【参考方案7】:

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

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

<tag attribute="value"/>

或者这个:

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

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

【讨论】:

【参考方案8】:

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

http://sourceforge.net/projects/tinyxml

【讨论】:

似乎使用了一种 DOM 风格的方法,这可能不适合这个特定的应用程序。无论如何感谢您的链接。

以上是关于MFC C++ 应用程序的最佳 XML 序列化库的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中实现断言检查的最佳方法是啥?

使列表控件中的单个项目可编辑(C++、MFC)

什么是 C++ 的最佳开放 XML 解析器? [复制]

从 Java 到 XML 的序列化/反序列化的最佳实践

在 Visual C++ 中测量操作速度的最佳方法

将此 XML 反序列化为对象的最佳方法