1

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

不应使用数据合同名称“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 声明的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 登录等的字符串和数字,你可以把它留给手机来处理墓碑。就我而言,我需要一个更强大的系统。

4

2 回答 2

2

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

于 2012-04-30T18:54:01.427 回答
0

ApplicationStateDataContractSerializer在墓碑化时被序列化。听起来您正在添加无法正确反序列化的内容。
有两种选择:

  1. 确保您保存的任何内容都可以DataContractSerializer正确反序列化。
    或者
  2. 自己处理序列化和反序列化(使用比 DataContractSerializer 更快的东西,例如 json.net),并且只将序列化的字符串添加到状态对象。
于 2012-05-01T21:18:40.120 回答