2013-08-30 2 views
1

Я получил эту ситуацию:Тип «System.Windows.UIElement» не может быть сериализовать при выходе из приложения

Custom Control -> Navigate to its Settings Page -> Tap on a button in the Settings Page -> Show a PhotoChooserTask 

Итак, давайте говорить, что этот пользовательский элемент управления должен просто показать изображение, загруженное из пользователя галерея.

При нажатии на пользовательский элемент управления, я показываю страницу настроек XAML, в которой есть кнопка для загрузки изображения из галереи, и эта кнопка запускает PhotoChooserTask.

Теперь проблема заключается в том, что она запускает исключение сразу после запуска задачи.

Вот трассировки стека:

+  $exception {System.Runtime.Serialization.InvalidDataContractException: Type 'System.Windows.UIElement' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. Alternatively, you can ensure that the type is public and has a parameterless constructor - all public members of the type will then be serialized, and no attributes will be required. 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException(String message, Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContract(RuntimeTypeHandle typeHandle, Type type, SerializationMode mode) 
    at System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper..ctor(Type type) 
    at System.Runtime.Serialization.ClassDataContract..ctor(Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContract(RuntimeTypeHandle typeHandle, Type type, SerializationMode mode) 
    at System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper..ctor(Type type) 
    at System.Runtime.Serialization.ClassDataContract..ctor(Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContract(RuntimeTypeHandle typeHandle, Type type, SerializationMode mode) 
    at System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper..ctor(Type type) 
    at System.Runtime.Serialization.ClassDataContract..ctor(Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContract(RuntimeTypeHandle typeHandle, Type type, SerializationMode mode) 
    at System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper..ctor(Type type) 
    at System.Runtime.Serialization.ClassDataContract..ctor(Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContract(RuntimeTypeHandle typeHandle, Type type, SerializationMode mode) 
    at System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper..ctor(Type type) 
    at System.Runtime.Serialization.ClassDataContract..ctor(Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContract(RuntimeTypeHandle typeHandle, Type type, SerializationMode mode) 
    at System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper..ctor(Type type) 
    at System.Runtime.Serialization.ClassDataContract..ctor(Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContract(RuntimeTypeHandle typeHandle, Type type, SerializationMode mode) 
    at System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper..ctor(Type type) 
    at System.Runtime.Serialization.ClassDataContract..ctor(Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.DataContract.GetDataContract(RuntimeTypeHandle typeHandle, Type type, SerializationMode mode) 
    at System.Runtime.Serialization.XmlObjectSerializerContext.GetDataContract(RuntimeTypeHandle typeHandle, Type type) 
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType(XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle objectTypeHandle, Type objectType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType) 
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle) 
    at WriteKeyValueOfstringanyTypeToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , ClassDataContract) 
    at System.Runtime.Serialization.ClassDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) 
    at WriteArrayOfKeyValueOfstringanyTypeToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract) 
    at System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) 
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) 
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) 
    at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) 
    at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) 
    at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) 
    at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter writer, Object graph) 
    at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(Stream stream, Object graph) 
    at Microsoft.Phone.Shell.BaseStreamPersister.Serialize(IDictionary`2 dictionary, IEnumerable`1 knownTypes) 
    at Microsoft.Phone.Shell.PhoneApplicationService.SaveState() 
    at Microsoft.Phone.Shell.PhoneApplicationService.FireDeactivated(UInt32 reason) 
    at Microsoft.Phone.TaskModel.Interop.ITask.Pause.Invoke(UInt32 reason) 
    at Microsoft.Phone.TaskModel.Interop.Task.FireOnPause(UInt32 reason)} System.Exception {System.Runtime.Serialization.InvalidDataContractException} 

Я понимаю, что это полностью связано с состоянием приложения, и я думаю, что это происходит потому, что операционная система пытается «заморозить» приложение, чтобы возобновить свое состояние после того, как задача завершено.

Что я не понимаю, так это то, как эта система работает и что я должен делать, чтобы избежать исключения и правильно ее сериализовать.

Пожалуйста, имейте в виду, что у меня есть несколько уровней наследования (что-то вроде «UserControl -> Custom 1 -> Custom 2 -> Custom 3 -> Current Custom Control).

Любая идея?

EDIT:

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

Не имеет значения, оставлю ли я его, выполнив задачу или нажав кнопку с окнами.

Теперь это единственная страница, на которой я использовал внешнюю библиотеку (Coding4Fun Toolkit), поэтому я думаю, что именно здесь проблема лежит, но я все еще не понимаю, как ее исправить, или если это ошибка библиотека!

+0

Почему вы ВСЕГДА хотите сериализовать элемент управления? – undefined

+0

Потому что сообщение об исключении предлагает мне сделать это. – StepTNT

+0

Можете ли вы предоставить реестр, чтобы создать ошибку на https://coding4fun.codeplex.com/WorkItem/Create, чтобы я мог взглянуть? –

ответ

0

Это InvalidDataContractException выбрасывается при

DataContractSerializer или NetDataContractSerializer встречает недействительный контракт данных во время сериализации и десериализации. (Из MSDN)

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

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

Ссылаясь на ваш комментарий «Поскольку сообщение об исключении предлагает мне сделать это», вы использовали сериализацию до, у вас есть это Exception?

+0

Я не использую какую-либо сериализацию в своем коде, и я использую 'Coding4Fun Toolkit' как внешнюю библиотеку – StepTNT

Смежные вопросы