Сбой DataContractSerializer, нулевые данные

У меня есть код для 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;
    }

Он отлично работает на Windows Phone 7. Я перенес приложение на Windows Phone 8, и все остальное в приложении работает, кроме этого фрагмента.

Сравнивая, что происходит в Windows Phone 7 и 8, "rsssettings" в WP8 остается нулевым, пока он правильно заполняется в WP7. В этой части кода не было никаких изменений кода.

Все работает так же, пока:

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

Исключение не называется.

Кто-нибудь знает, как решить эту проблему?

1 ответ

Решение

Да, тебе это не понравится.

DataContractSerializer на WP8 требует, чтобы элементы XML были организованы в алфавитном порядке. Это сделано, поскольку предполагается, что все, что входит в DataContractSerializer, происходит из другого DataContractSerializer.

Я хотел бы сделать это, но я не. Совместимость платформы приложений MSDN для Windows Phone:

Класс DataContractSerializer

WP8 Behavior: 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. Подробнее об этом в этой замечательной статье Дена Делимарского.
  3. Если вы используете не-RSS XML, рассмотрите возможность использования прямой XML-сериализации с XmlSerializer. За мои деньги это лучший и самый простой способ сделать сериализацию и десериализацию XML по проводам.
  4. Изменение поведения с WP7 на WP8 включается через режим Quirks. Это означает, что приложения WP7, работающие на WP8, будут работать нормально. Если ваше приложение не использует наборы функций WP8, вы можете оставить все приложение в качестве приложения WP7.
Другие вопросы по тегам