Исключение NullReferenceException в приложении Silverlight на Windows Phone 7

#c# #silverlight #windows-phone-7

#c# #silverlight #windows-phone-7

Вопрос:

У меня есть приложение Silverlight для Windows Phone 7. Это приложение работает нормально, за исключением случаев, когда пользователь откладывает приложение в долгий ящик и пытается повторно активировать его. Когда они пытаются отреагировать на приложение, я получаю исключение NullReferenceException, когда я запускаю приложение с одной конкретной страницы. Моя проблема в том, что я ни за что на свете не смогу определить действительную причину этого исключения.

Кто-нибудь знает какие-нибудь хорошие бесплатные инструменты, которые помогли бы мне изучить потенциальную причину? Или у кого-нибудь есть какой-либо способ определить причину. Трассировка стека не помогает, поскольку она выглядит следующим образом, но не определяет, где проблема в моем коде:

    at System.Runtime.Serialization.XmlFormatReader.StoreCollectionValue(Objectamp; collection, Object value, CollectionDataContract collectionContract)
   at System.Runtime.Serialization.XmlFormatReader.LoadValueOfCollection(DeserializedObject desObj, Object value, Int32 membersRead, Type itemType)
   at System.Runtime.Serialization.XmlFormatReader.ReadGetOnlyCollectionItem(DeserializedObject desObj, CollectionDataContract collectionContract, Int32 membersRead)
   at System.Runtime.Serialization.XmlFormatReader.ReadGetOnlyCollection(DeserializedObject desObj, CollectionDataContract collectionContract, Int32 membersRead)
   at System.Runtime.Serialization.XmlFormatReader.Deserialize(XmlObjectSerializerReadContext context)
   at System.Runtime.Serialization.XmlFormatReader.InitializeCallStack(DataContract clContract, XmlReaderDelegator xmlReaderDelegator, XmlObjectSerializerReadContext xmlObjContext, XmlDictionaryString[] memberNamesColl, XmlDictionaryString[] memberNamespacesColl)
   at System.Runtime.Serialization.CollectionDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)
   at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader)
   at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, DataContractamp; dataContract)
   at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns)
   at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName)
   at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName)
   at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader)
   at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(Stream stream)
   at Microsoft.Phone.Shell.StreamPersister.Deserialize(Byte[] blob, IEnumerable`1 knownTypes, IDictionary`2amp; dictionary)
   at Microsoft.Phone.Shell.StreamPersister.Load(ShellPageManager shellPageManager, String key, IEnumerable`1 knownTypes, IDictionary`2amp; dictionary)
   at Microsoft.Phone.Shell.PhoneApplicationService.FireActivated()
   at Microsoft.Phone.Execution.NativeEmInterop.FireOnResume()
  

Похоже, это какая-то проблема с сериализацией. Однако я не знаю, что могло бы вызвать проблему. Спасибо!

Комментарии:

1. Возможно, вы используете ApplicationSettings для своего надгробия?

2. Если вы зайдете в VS2010 в раздел Debug > Exceptions и проверите, когда произойдет сбой . Возникают СЕТЕВЫЕ исключения, вы не можете найти фактический источник, который выдает ошибку?

3. Это действительно странно. Я создал совершенно новую страницу, и я получаю исключение NullReferenceException на странице при возвращении из Tombstoning.

Ответ №1:

Сегодня утром у меня была такая же проблема. Моя проблема была связана с использованием базового массива. Я изменил массив на ObservableCollection , и это сработало. Я подробно описал проблему с кодом в этом блоге.

Ответ №2:

Попробуйте выполнить отладку с точкой останова в обработчике событий Application_Activated. Что-то может быть нулевым при повторной активации приложения:

 private void Application_Activated(object sender, ActivatedEventArgs e)
{
   //insert a breakpoint here
  

Комментарии:

1. Тело моего обработчика событий Application_Activated пустое. Итак, я поместил в него поле для сообщений, просто чтобы напечатать «Привет». Как ни странно, окно сообщения никогда не появляется.

Ответ №3:

Если вы подозреваете проблему с сериализацией, вы можете легко проверить содержимое загруженных данных, например

 using (var fs = isoStore.OpenFile(StoragePath, System.IO.FileMode.Open))
{
    StreamReader sr = new StreamReader(fs);
    string content = sr.ReadToEnd();
    // Put a break point here and show content variable in Xml Visualizer.
    // Can be done from Locals Debug window for example.
}
  

Но я бы начал с проверки логики вашего приложения. Скорее всего, что-то, что еще не было инициализировано. Должно быть легко найдено в отладчике.

Комментарии:

1. Что такое StoragePath? Где установлена эта переменная?