2008-10-22 85 views
5

我有一個應用程序,使用MFC和Stingray庫以C++編寫。該應用程序適用於各種各樣的大數據類型,它們都基於MFC Document/View序列化派生的功能進行了序列化。我還添加了基於Stingray庫的XML序列化選項,Stingray庫通過Microsoft XML SDK實現DOM。雖然易於實現,但性能非常糟糕,只能在非常小的文檔以外的任何地方使用。MFC C++應用程序的最佳XML序列化庫

你會推薦什麼樣的其他XML序列化工具用於這個場景。我不想要DOM,因爲它似乎是一個記憶豬,我已經在處理大量的內存數據。理想情況下,我想要一個流式解析器,它的速度很快,並且易於與MFC一起使用。我目前的領跑者是expat這是快速和簡單的,但需要添加很多類的序列化代碼。任何其他有效和更容易實施的人們會推薦的替代方案?

回答

4

Boost Serialization庫支持XML。這個庫基本包括:

  1. 從MFC序列化的原則開始,並採取它提供的所有好東西。
  2. 解決MFC序列化的每一個問題!

與MFC相比有一些改進是對XML的支持。 請注意,您不一定要控制此序列化的XML模式。它使用自己的模式。

+0

boost序列化看起來非常合適,並且很可能是遠離MFC的第一步。 – 2008-10-22 14:19:08

2

一個好的解決方案是libxml。它爲XML處理提供輕量級的SAX解析和數據結構。有幾個DOM庫建立在libxml之上。

不幸的是它是一個C庫,但C++包裝可用。

幾年前,由於您提到的性能問題,我從MSXML切換到libxml。

如果您決定使用libxml,您還應該看看libxslt

+0

LibXML一路!別忘了它的姐妹組件LibXSLT。 – spoulson 2008-10-22 11:50:15

+0

好點,我在我的回答中提到過。 – 2008-10-22 11:57:19

0

我們使用TinyXML來滿足我們所有的XML需求,無論是MFC還是直通C++。

http://sourceforge.net/projects/tinyxml

+0

似乎使用的DOM風格的方法可能不適合這個特定的應用程序。無論如何感謝鏈接。 – 2008-10-23 10:20:06

1

RapidXML,我使用它在MFC應用程序進行一些修改,以支持UTF-16的std :: string。到目前爲止,我對此非常滿意。

4

這是一個古老的問題。 1999年和2000年,我擔任開發團隊的團隊負責人,對全球最大的軟件項目提供了最重要的路徑依賴關係,這是我在此期間工作的重點。我相信,這個輪子是由多位工程師發明的,他們不知道其他人已經發明瞭它。 C++中的XML數據綁定也是如此。我也發明了它,並且在各種項目上我已經完善了10多年。我有一個解決方案來解決這裏提到的問題以及一些重複出現的問題:

  1. XML更新。這是將XML的子集重新應用於現有對象模型的能力。在許多情況下,XML綁定到索引對象,我們不能爲每次更新重新編制索引。

  2. COM和CORBA接口管理。同樣,XML數據綁定可以通過面向對象的實踐自動化 - 接口對象的實例也可以將這些數據提供給應用程序層。

  3. 狀態跟蹤。應用程序通常需要區分空值和缺失值 - 都創建一個空字符串。這提供了驗證以及數據綁定。

源代碼使用最少限制性許可證 - 因此GPL。該項目支持和管理,從這裏:

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

現在,它的2010年,我相信沒有人會試圖重新發明輪子,因爲有幾個選擇。恕我直言 - 這個輪子是最完善和全面的實施可用。

享受。

1

的gSOAP的工具包自動序列化天然C和C++數據到/從XML和支持通過XML數據綁定完整的XML架構規範:

gSOAP SourceForge Project

自1999年以來它已演變到顯著代碼庫使用代碼生成工具和庫。它支持許多數據綁定和自定義功能,這對於將XML模式類型映射到C和C++類型或從中映射尤其重要。它可以序列化任何C/C++類型以及STL容器,容器模板和循環數據結構。它已被用於W3C Schema Patterns for Databinding工作組(自數年以來100%的模式模式覆蓋率成功)。有一個積極的開源用戶羣,gSOAP開發功能已被許多工業項目和財富100強公司用於開發SOAP/XML基礎架構。

1

這是遊戲後期,我只想提一提,我們也使用LIBXML。它堅固可靠,並且運作良好。有點太低級,你會想在它的函數之上構建一些包裝。

<tag attribute="value"/> 

或本:

舉例來說,你會取決於你是否有這樣的功能得到回報的不同序列

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

有時你可能想的是,有時你不不在乎。