6

RSSアプリ用のWindowsPhone7のコードがあります。

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;
    }

これは、WindowsPhone7で完全に機能します。アプリをWindowsPhone8に移植しましたが、このスニペットを除いて、アプリ内の他のすべてが機能します。

Windows Phone 7と8で何が起こるかを比較すると、WP8の「rsssettings」はWP7に正しく入力されている間、nullのままです。コードのこの部分に対するコードの変更はまったくありません。

次の状態になるまで、すべて同じように機能します。

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

例外は呼び出されません。

この苛立たしい問題を解決する方法について誰かが手がかりを持っていますか?

4

1 に答える 1

13

ええ、あなたはこれを気に入らないでしょう。

WP8 の DataContractSerializer では、XML 要素をアルファベット順に編成する必要があります。これは、DataContractSerializer に入るすべてのものが別の DataContractSerializer から出てくるという前提から行われています。

私はこれを作っていたらよかったのですが、そうではありません。MSDN のApp platform compatibility for 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. WP7 から WP8 への動作の変更は、互換モードを介して有効になります。つまり、WP8 で実行されている WP7 アプリは引き続き正常に実行されます。アプリが WP8 機能セットの恩恵を受けない場合は、アプリ全体を WP7 アプリとして保持できます。
于 2012-12-23T22:27:00.247 に答える