6

我有一些适用于 RSS 应用程序的 Windows Phone 7 代码:

private RSSSettings DeserializeSettings(string data)
    {
        RSSSettings rsssettings;
        try
        {
            var ser = new DataContractSerializer(typeof(RSSSettings));
            using (var sr = new StringReader(data))
            using (var xr = XmlReader.Create(sr))
                rsssettings = (RSSSettings)ser.ReadObject(xr);
        }
        catch (Exception ex)
        {
            ex.ToString();
            rsssettings = new RSSSettings() { Version = -1 };
        }
        return rsssettings;
    }

它在 Windows Phone 7 上完美运行。我将应用程序移植到 Windows Phone 8,应用程序中的其他所有内容都可以正常工作,除了这个片段。

比较 Windows Phone 7 和 8 中发生的情况,WP8 中的“rsssettings”在 WP7 中正确填充时保持为空。这部分代码根本没有任何代码更改。

一切都一样,直到:

rsssettings = (RSSSettings)ser.ReadObject(xr);

不调用异常。

任何人都知道如何解决这个令人沮丧的问题?

4

1 回答 1

13

是的,你不会喜欢这样的。

WP8 上的 DataContractSerializer 要求 XML 元素按字母顺序组织。这样做是因为假设进入 DataContractSerializer 的所有内容都来自另一个 DataContractSerializer。

我希望我是在编造这个,但我不是。来自 MSDN 的Windows Phone 应用平台兼容性

DataContractSerializer 类

WP8行为:XML 元素必须按字母顺序排序。

WP7行为:XML 元素可以是无序的。

在这一点上,您有几种选择:

  1. ̶a̶l̶p̶h̶a̶b̶e̶t̶i̶c̶a̶l̶l̶y̶̶o̶r̶d̶e̶r̶ ̶y̶o̶u̶̶X̶M̶L̶。不,这真的不是一个选择。
  2. 由于您似乎正在获取 RSS,因此您可以考虑使用专门为 RSS/Atom 构建的WCF 的System.ServiceModel.Syndication.SyndicationFeed 。在Den Delimarsky的这篇精彩文章中了解更多信息。
  3. 如果您使用非 RSS XML,请考虑使用XmlSerializer的直接 Xml 序列化。对我来说,这是通过网络进行 XML 序列化和反序列化的最好和最简单的方法。
  4. 通过 Quirks Mode 启用从 WP7 到 WP8 的行为变化。这意味着在 WP8 上运行的 WP7 应用程序仍然可以正常运行。如果您的应用程序不能从 WP8 功能集中受益,您可以将整个应用程序保留为 WP7 应用程序。
于 2012-12-23T22:27:00.247 回答