墓碑问题

时间:2012-04-30 18:37:57

标签: c# windows-phone-7 tombstoning

当我尝试和我的应用程序进行逻辑删除时,我在手机上遇到过这种情况。

输入数据合约名称为'UTF8Encoding:http://schemas.datacontract.org/2004/07/System.Text'的'System.Text.UTF8Encoding'不是预期的。将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

我没有在我的应用程序中的任何地方使用WCF或数据合同,而且我没有在逻辑删除上执行任何代码,因此我不确定它来自何处。我的代码中的任何地方都没有任何文本或模式。

在堆栈跟踪中,我没有看到我的任何代码被执行。

System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle)
...

at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph)

at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter writer, Object graph)

at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(Stream stream, Object graph)

at Microsoft.Phone.Shell.StreamPersister.Serialize(IDictionary`2 dictionary, IEnumerable`1 knownTypes)

at Microsoft.Phone.Shell.StreamPersister.Save(ShellPageManager shellPageManager, String key, IDictionary`2 dictionary, IEnumerable`1 knownTypes)

at Microsoft.Phone.Shell.PhoneApplicationService.FireDeactivated()

at Microsoft.Phone.Execution.NativeEmInterop.FireOnPause()

我该如何调试这样的东西?

解决方案:不容易,但在调试菜单中启用异常是一个开始,然后使用shift + f9尝试一些值来查看可能导致它的原因。最后的答案是在应用程序关闭之前清除状态。

Application_Deactivated or Closing(){
            SerializeToPhone(); //save state to phone manually
            var appService = PhoneApplicationService.Current;
            appService.State.Clear();
}

这样,您可以清除对象,这样手机就不会尝试为您管理状态。我添加了自己的代码,使用自定义序列化程序将状态保存到手机,并在重新激活时从手机中读取。我想如果你的应用程序很简单,只有一些字符串和数字没有网络安全或Facebook登录等,你可以把它留给手机来处理墓碑。就我而言,我需要一个更强大的系统。

2 个答案:

答案 0 :(得分:2)

听起来您的某个类型中有一个Encoding(或UTF8Encoding)变量会自动序列化,以便您的应用可以恢复。仔细查看您的代码,看看是否有任何类似的变量。如果有,下一步是弄清楚你是否真的需要这些变量。

答案 1 :(得分:0)

当逻辑删除时,ApplicationState被序列化为DataContractSerializer。听起来你正在添加一些无法正确解密的东西 有两种选择:

  1. 确保DataContractSerializer正确地对您保存的内容进行反序列化 或
  2. 自己处理序列化和反序列化(使用比DataContractSerializer更快的东西,例如json.net),只将序列化字符串添加到状态对象。