2015-04-23 5 views
0

У меня есть приложение для Windows 8,1 приложение - я совершенно новый для разработки Windows Phone!Windows Phone 8.1 Suspend

Он содержит различные страницы и пользовательские UserControls.

Я пытаюсь приостановить приложение для доступа к файловой системе/камере.

Изначально я получаю сообщение об ошибке, потому что я проходил сложные объекты в Frame.Navigate, но я решил, что путем добавления сложного объекта к SuspensionManager.SessionState["..."] и извлечения его в функции OnNavigatedTo.

Теперь ошибка я получаю, как приложение приостановит, является:

Тип «Windows.UI.Xaml.UIElement» не может быть сериализации. Подумайте о том, чтобы маркировать его атрибутом DataContractAttribute и маркировать все его элементы, которые вы хотите сериализовать с атрибутом DataMemberAttribute. Кроме того, вы можете гарантировать, что тип является общедоступным и имеет конструктор без параметров: все публичные члены этого типа будут сериализованы, и никаких атрибутов не потребуется.

Я пытался сделать то, что он предложил - Добавлен атрибут к классу и [DataMember][DataContract] всех свойств и полей.

У меня по-прежнему такая же ошибка. Google не предлагает много помощи, кроме как попробовать выше, поэтому я через каждый пользовательский UserControl и добавил атрибуты к ним - все еще не работал, поэтому я добавил атрибуты на каждую страницу также - главным образом, из отчаяния.

Итак, теперь все должно быть сериализуемым, но я все равно получаю ту же ошибку! Я сомневаюсь, что это полезно, но вот StackTrace:

в System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException (String сообщения, Тип типа) в System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract (Int32 идентификатор , RuntimeTypeHandle typeHandle, тип тип) на System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation (Int32 идентификатор, RuntimeTypeHandle typeHandle, Тип тип) на System.Runtime.Serialization.DataContract.GetDataContractSkipValidation (Int32 идентификатор, RuntimeTypeHandle typeHandle, Тип) в System.Runtime.Serialization.DataContract.GetDataContract (RuntimeTypeHandle typeHandl e, Тип типа, Режим SerializationMode) at System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper..ctor (Тип типа) at System.Runtime.Serialization.ClassDataContract..ctor (Тип типа) at System.Runtime.Serialization. DataContract.DataContractCriticalHelper.CreateDataContract (Int32 идентификатор, RuntimeTypeHandle typeHandle, Тип тип) на System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation (Int32 идентификатор, RuntimeTypeHandle typeHandle, Тип типа) в System.Runtime.Serialization.DataContract.GetDataContractSkipValidation (Int32 id, RuntimeTypeHandle typeHandle, Тип типа) at System.Runtime.Serialization.DataContract.GetDataContract (RuntimeTypeHandle typeHandle, Тип типа, Режим SerializationMode) at System.Runtime. Serialization.ClassDataContract.ClassDataContractCriticalHelper..ctor (Тип) в System.Runtime.Serialization.ClassDataContract..ctor (Тип) на System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract (Int32 Идентификатор, RuntimeTypeHandle typeHandle, Тип) в System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation (Int32 Идентификатор, RuntimeTypeHandle typeHandle, Тип тип) на System.Runtime.Serialization.DataContract.GetDataContractSkipValidation (Int32 идентификатор, RuntimeTypeHandle typeHandle, Тип типа) в System.Runtime.Serialization.DataContract.GetDataContract (RuntimeTypeHandle typeHandle, Тип, режим SerializationMode) в System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper..ctor (Тип) в System.Runtime.Serialization.ClassDataContract..ctor (Тип) в System.Runtime.Serialization .DataContract.DataContractCriticalHelper.CreateDataContract (Int32 id, RuntimeTypeHandle typeHandle, Тип типа) в System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation (Int32 Идентификатор, RuntimeTypeHandle typeHandle, Тип тип) на System.Runtime.Serialization.DataContract.GetDataContractSkipValidation (Int32 Идентификатор, RuntimeTypeHandle typeHandle, Тип тип) на System.Runtime.Serialization.DataContract.GetDataContract (RuntimeTypeHandle typeHandle, типа Type, режим SerializationMode) в System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper..ctor (Тип) в System.Runtime.Serialization.ClassDataContract..ctor (Тип) в System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract (Int32 идентификатор , RuntimeTypeHandle typeHandle, Тип типа) at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation (Int32 id, RuntimeTypeHandle typeHandle, Тип типа) в Системе. Runtime.Serialization.DataContract.GetDataContractSkipValidation (Int32 Идентификатор, RuntimeTypeHandle typeHandle, Тип тип) на System.Runtime.Serialization.DataContract.GetDataContract (RuntimeTypeHandle typeHandle, типа Type, режим SerializationMode) в System.Runtime.Serialization.DataContract.CheckAndAdd (Тип, словарь nameToDataContractTable) на System.Runtime.Serialization.XmlObjectSerializerContext.GetDataContractsForKnownTypes (IList`1 knownTypeList) на System.Runtime.Serialization.DataContractSerializer.get_KnownDataContracts() в System.Runtime.Serialization.XmlObjectSerializerContext.get_SerializerKnownDataContracts() в System.Runtime.Serialization.XmlObjectSerializerContext.GetDataContractFromSerializerKnownTypes (Xml QualifiedName QName) на System.Runtime.Serialization.XmlObjectSerializerContext.ResolveDataContractFromKnownTypes (String TYPENAME, Струнные typeNs, DataContract memberTypeContract) в System.Runtime.Serialization.XmlObjectSerializerContext.IsKnownType (DataContract DataContract, Тип declaredType) в System.Runtime.Serialization. XmlObjectSerializerWriteContext.SerializeAndVerifyType (DataContract DataContract, XmlWriterDelegator XMLWriter, OBJ объект, булева verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Тип declaredType) на System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType (XmlWriterDelegator XMLWriter, OBJ Object, RuntimeTypeHandle objectTypeHandle, тип ObjectType, Int32 declaredTypeID, RuntimeTypeHandle объявленTypeHandle, Тип объявленType) в System.Runtime.Serialization.XmlObjectS erializerWriteContext.InternalSerialize (XmlWriterDelegator XMLWriter, OBJ объект, булева isDeclaredType, булева writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle) на WriteKeyValueOfstringanyTypeToXml (XmlWriterDelegator, объект, XmlObjectSerializerWriteContext, ClassDataContract) на System.Runtime.Serialization.ClassDataContract.WriteXmlValue (XmlWriterDelegator XMLWriter, объект OBJ, XmlObjectSerializerWriteContext контекст) в WriteArrayOfKeyValueOfstringanyTypeToXml (XmlWriterDelegator, объект, XmlObjectSerializerWriteContext, CollectionDataContract) в System.Runtime.Serialization.CollectionDataContract.WriteXmlValue (XmlWriterDelegator XMLWriter, OBJ Object, XmlObjectSerializerWriteContext контекст) в System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue (DataContract DataContract, XmlWriterDelegator XMLWriter, OBJ Объект, RuntimeTypeHandle declaredTypeHandle) на System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType (DataContract DataContract, XmlWriterDelegator XMLWriter, OBJ Object, RuntimeTypeHandle declaredTypeHandle) в System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent (XmlWriterDelegator писатель, граф объектов, dataContractResolver dataContractResolver) на System.Runtime.Serialization.DataContractSerializer.InternalWriteObject (XmlWriterDelegator писатель, графа объектов, dataContractResolver dataContractResolver) в System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions (XmlWriterDelegator писатель, граф объектов, dataContractResolver dataContractResolver) на System.Runtime.Ser ialization.XmlObjectSerializer.WriteObject (XmlDictionaryWriter писатель, граф объектов) в System.Runtime.Serialization.XmlObjectSerializer.WriteObject (поток поток, графа объекта) на eAuditWindowsPhone.Common.SuspensionManager.d__0.MoveNext()

I 'действительно не уверен, что попробовать дальше? Я бы приветствовал некоторые предложения.

ответ

1

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

Вы можете добавлять атрибуты (DataContract или DataMember) к классам, которые вы создали сами, и вы не сможете сделать UI Elements сериализуемым. Возможно, ваш UserControl является DataContract, но он все еще имеет некоторые свойства типа UIElement, которые не будут сериализованы.


Ответ: Вы должны просто хранить значения вас интересуют (как TextBox.Text или ToggleButton.IsActive, ...).

+0

Спасибо, но сначала я ничего не сериализую. Ошибка произошла по умолчанию. Только после этого я начал добавлять атрибуты '[DataContract] и' [DataMember]. Считаете ли вы, что «Тип» Windows.UI.Xaml.UIElement «не может быть сериализован» - это красная селедка, а проблема сериализации - в другом месте? – Rick

+0

Да, параметры навигации и состояние сеанса сериализуются диспетчером подвески. И вы помещаете что-то там, в котором содержится ссылка на элемент пользовательского интерфейса (и это свойство, как представляется, имеет атрибут члена данных). –

+0

Итак, в основном: SessionState не подходит для сложных объектов. :) Вы должны просто удалить em и воссоздать их, если приложение действительно нужно перезапустить. –