Сериализация контейнера RSS-каналов? - PullRequest
2 голосов
/ 02 июня 2011

Я работаю над проектом для RSS-клиента.Сейчас я получаю фид, используя SyndicationFeed и XmlReader, и добавляю его в список:

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

SyndicationFeed, и большинство его свойств не сериализуемы.Мне нужно иметь возможность сохранять каналы и их соответствующие элементы, когда моя программа закрыта.У меня есть решение для базы данных, работающее с Entity Framework, но я бы хотел уйти от этого.Поэтому моей следующей мыслью было просто сериализовать контейнер со всеми фидами, но это не пойдет.Должен ли я написать класс serializabl, который имитирует SyndicationFeed и его свойства и выполняет какие-то действия по упаковке и распаковке, или есть лучший способ?

1 Ответ

3 голосов
/ 02 июня 2011

Класс SyndicationFeed имеет метод SaveAsAtom10 и метод SaveAsRss20 , оба из которых принимают экземпляр XmlWriter, который вы может использовать что угодно в качестве основного хранилища для.

Лично я бы выбрал метод SaveAsAtom10, так как считаю, что Atom - более богатый формат.

Тем не менее, вы можете легко сохранить это в одном отдельном документе большего размера, создав корневой элемент и дочерний элемент в вашем собственном пространстве имен, а затем сохранив содержимое каждого канала в качестве дочернего, например:

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

Я бы использовал экземпляры XDocument и XElement для создания вышеуказанного контейнера, поскольку управление пространством имен на намного проще при использовании этих классы. Кроме того, класс XElement предоставляет CreateWriter и CreateReader, которые будут выставлять экземпляры XmlWriter и XmlReader соответственно, которые затем вы можете передать своему SaveAsAtom / SaveAsRss20 методов.

Однако я бы хотел, чтобы вы хранили каждый из этих предметов отдельно; В зависимости от того, сколько у вас каналов, создание одного большого супер-документа может быть слишком большой потерей ресурсов, в зависимости от ваших потребностей. Отдельные экземпляры документов, сохраняющиеся в отдельных объектах, к которым вы можете обращаться независимо, вероятно, будут гораздо эффективнее обрабатывать.

Вы все еще можете использовать методы SaveAsAtom10 и SaveAsRss20 для сериализации каналов.

...