Pertanyaan DataContractSerializer gagal, data null


Saya punya beberapa kode untuk Windows Phone 7, untuk aplikasi 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;
    }

Ia bekerja dengan sempurna pada Windows Phone 7. Saya memindahkan aplikasi ke Windows Phone 8, dan semua yang lain di aplikasi berfungsi kecuali untuk cuplikan ini.

Membandingkan apa yang terjadi di Windows Phone 7 dan 8, "rsssettings" di WP8 tetap nol sementara mengisi dengan benar di WP7. Tidak ada perubahan kode untuk bagian kode ini sama sekali.

Semuanya bekerja sama sampai:

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

Pengecualian tidak disebut.

Adakah yang tahu bagaimana menyelesaikan masalah yang membuat frustrasi ini?


5
2017-12-23 20:18


asal


Jawaban:


Ya, kamu tidak akan menyukai ini.

DataContractSerializer pada WP8 membutuhkan elemen XML diatur menurut abjad. Itu dilakukan sejak asumsi bahwa semua yang masuk ke DataContractSerializer keluar dari DataContractSerializer lain.

Saya berharap saya mengada-ada, tapi saya tidak. Dari MSDN Kompatibilitas platform aplikasi untuk Windows Phone:

Kelas DataContractSerializer 

WP8 Perilaku: elemen XML harus diurutkan berdasarkan abjad.

WP7 Perilaku: elemen XML dapat tidak diurutkan.

Ada beberapa alternatif untuk Anda saat ini:

  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̶. Tidak, itu benar-benar bukan pilihan.
  2. Karena sepertinya Anda mendapatkan RSS, Anda dapat mempertimbangkan untuk menggunakan WCF System.ServiceModel.Syndication.SyndicationFeed yang khusus dibuat untuk RSS / Atom. Lebih lanjut tentang ini di ini artikel bagus oleh Den Delimarsky.
  3. Jika Anda menggunakan XML non-RSS, pertimbangkan untuk menggunakan Xml Serialisasi langsung XmlSerializer. Untuk uang saya, inilah cara terbaik dan paling sederhana untuk dilakukan melalui serialisasi dan deserialisasi kabel XML.
  4. Perubahan perilaku dari WP7 ke WP8 diaktifkan melalui Mode Quirks. Artinya aplikasi WP7 yang berjalan di WP8 akan tetap berjalan OK. Jika aplikasi Anda tidak mendapat manfaat dari fitur WP8, Anda dapat menyimpan seluruh aplikasi sebagai aplikasi WP7.

12
2017-12-23 22:27