【问题标题】:Tombstone Issue墓碑问题
【发布时间】:2012-10-27 21:59:18
【问题描述】:

当我尝试为我的应用程序墓碑时,我一直在手机上遇到这种情况。

不应使用数据协定名称“UTF8Encoding:http://schemas.datacontract.org/2004/07/System.Text”键入“System.Text.UTF8Encoding”。将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。

我没有在我的应用程序的任何地方使用 WCF 或数据协定,也没有在 tombstone 上执行任何代码,所以我不确定这是从哪里来的。我的代码中也没有任何文本或架构。

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

System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract,XmlWriterDelegator xmlWriter,Object obj,Boolean verifyKnownType,RuntimeTypeHandle 声明的TypeHandle) ... 在 System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer,对象图) 在 System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter 编写器,对象图) 在 System.Runtime.Serialization.XmlObjectSerializer.WriteObject(流流,对象图) 在 Microsoft.Phone.Shell.StreamPersister.Serialize(IDictionary`2 字典,IEnumerable`1 knownTypes) 在 Microsoft.Phone.Shell.StreamPersister.Save(ShellPageManager shellPageManager,字符串键,IDictionary`2 字典,IEnumerable`1 knownTypes) 在 Microsoft.Phone.Shell.PhoneApplicationService.FireDeactivated() 在 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 登录等的字符串和数字,你可以把它留给手机来处理墓碑。就我而言,我需要一个更强大的系统。

【问题讨论】:

  • 您是否在任何地方使用Page.State?或者你有办法重现这个问题吗?
  • 我使用 ApplicationState 跨 xaml 页面维护我的项目。它包含一些列表的东西。除 GeoCoordinate 和 CookieContainer 之外的所有字符串。
  • ApplicationState 中提供类型的元数据可能会有所帮助

标签: c# windows-phone-7 tombstoning


【解决方案1】:

听起来您的其中一种类型中有一个Encoding(或UTF8Encoding)变量,该变量正在自动序列化,以便您的应用可以恢复。查看您的代码,看看是否有任何类似的变量。如果有,下一步就是确定您是否真的需要这些变量。

【讨论】:

  • 我看到的唯一地方是 WMApp 清单,我不会编辑。 。当我退出时,哪些变量会被序列化?是否所有对象都还活着并在范围内?
  • 我要说的是,当我从一个页面移动到另一个页面时,我会以状态存储一些复杂的项目。我在上面发布答案。
【解决方案2】:

ApplicationState 在墓碑化时使用DataContractSerializer 进行序列化。听起来您正在添加无法正确反序列化的内容。
有两种选择:

  1. 确保您保存的任何内容都可以通过DataContractSerializer 正确反序列化。
  2. 自己处理序列化和反序列化(使用比 DataContractSerializer 更快的方法,例如 json.net),并且只将序列化的字符串添加到状态对象。

【讨论】:

  • 有没有办法从调试器那里获得更多关于什么文本或对象实际导致它的反馈?假设我有大约 6 个对象,每个对象有 20-30 个属性,很难判断哪个是罪魁祸首。我现在有我的怀疑。其次,如果在应用程序关闭或唤醒时发生这种情况,我该如何替换某些东西的序列化方式。我从来没有在运行时看到这个,只有当应用程序关闭时。
  • 我建议你自己序列化,因为这样更容易调试。如果你真的想在墓碑上序列化事物,你必须使用ActivatedDeactivated 事件来交换放置状态的内容。总是序列化您在其中添加的更复杂的对象可能会更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 2018-08-20
  • 1970-01-01
相关资源
最近更新 更多