2011-06-02 65 views
2

我正在爲一個RSS客戶端項目工作。現在,我使用SyndicationFeedXmlReader取得源並將其添加到列表:序列化RSS提要的容器?

SyndicationFeed feed = SyndicationFeed.Load(
    XmlReader.Create("SOME URL TO A FEED")); 
List<SyndicationFeed> feeds = new List<SyndicationFeed>(); 
feeds.Add(feed); 

SyndicationFeed和大部分屬性是不可序列。當我的程序關閉時,我需要能夠保存提要及其各自的項目。我有一個與Entity Framework一起工作的數據庫解決方案,但我想擺脫這一點。所以我的下一個想法是簡單地序列化所有的飼料容器,但這是不行的。我應該寫一個模仿SyndicationFeed及其屬性,做一個排序拳和拆箱或是否有更好的辦法serializabl類?

回答

3

SyndicationFeed類有一個SaveAsAtom10 methodSaveAsRss20 method,兩者取XmlWriter例如,你可以使用任何東西作爲底層存儲。

就個人而言,我會用SaveAsAtom10方法去,因爲我相信Atom是更豐富的格式。

這就是說,你可以很容易地通過創建自己的命名空間的根元素和子元素,然後讓每個進料的內容作爲孩子,像這樣堅持到一個更大的單個文件這樣的:

<feeds xmlns="http://tempuri.org/MyFeedContainer"> 
    <feed> 
     <!-- Atom feed --> 
    </feed> 
    <feed> 
     <!-- Rss feed --> 
    </feed> 
    <!-- And so on.. --> 
</feeds> 

我會用XDocumentXElement實例來處理創建上面的容器,因爲命名空間管理是,使用這些類時更容易。此外,XElement類將公開CreateWriterCreateReader,它們將分別公開XmlWriterXmlReader實例,然後您可以將它們傳遞給您的SaveAsAtom/SaveAsRss20方法。

不過,我會在你身上留下深刻的印象存儲每個單獨的項目;取決於您有多少Feed,創建一個大型超級文檔可能會耗費太多資源,具體取決於您的需求。單個文檔實例持久存儲在您可以獨立訪問的單個實體中,可能會更有效地處理。

你仍然可以使用SaveAsAtom10SaveAsRss20方法序列化的飼料。

+0

謝謝。那麼只要將每個供稿源保存在磁盤上的自己的文檔中? – Pete 2011-06-02 21:46:22

+0

@Pete:我就是這麼做的。我想在你知道如何檢索比給料(如果需要的話),也可以通過在目錄中的文件只是列舉,如果你需要處理他們作爲一個整體的方式命名。 – casperOne 2011-06-02 21:50:16