DataContractSerializer失败,空数据

Rei*_*ter 5 c# xml-serialization windows-phone-7 data-serialization windows-phone-8

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

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;
    }
Run Code Online (Sandbox Code Playgroud)

它在Windows Phone 7上完美运行.我将应用程序移植到Windows Phone 8,除了此代码段之外,应用程序中的其他所有内容都可以正常工作.

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

一切都是一样的,直到:

rsssettings = (RSSSettings)ser.ReadObject(xr);
Run Code Online (Sandbox Code Playgroud)

不会调用该异常.

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

Jus*_*gel 12

是的,你不会喜欢这个.

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

我希望我能做到这一点,但我不是.来自MSDN的Windows Phone App平台兼容性:

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,因此可以考虑使用WCF的System.ServiceModel.Syndication.SyndicationFeed,它是专为RSS/Atom构建的.更多关于Den Delimarsky 这篇伟大文章的内容.
  3. 如果您使用的是非RSS XML,请考虑使用XmlSerializer直接使用Xml序列化.对于我的钱,这是最好和最简单的方法来做有线XML序列化和反序列化.
  4. 通过Quirks模式启用从WP7到WP8的行为更改.这意味着在WP8上运行的WP7应用程序仍然可以正常运行.如果您的应用程序无法从WP8功能集中受益,您可以将整个应用程序保留为WP7应用程序.