2012-04-30 84 views
1

当我尝试并t写我的应用程序时,我在手机上遇到过这种情况。墓碑发行

类型'System.Text.UTF8Encoding'与数据协定名称'UTF8Encoding:http://schemas.datacontract.org/2004/07/System.Text'不是预期的。将任何未知的静态类型添加到已知类型列表中 - 例如,使用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登录等,你可以把它留在手机来处理墓碑。在我的情况下,我需要一个更强大的系统。

+0

你是否在任何地方使用过“Page.State”?或者你有办法重现这个问题? –

+0

我使用ApplicationState在xaml页面上维护我的项目。它包含一些列表的东西。除GeoCoordinate和CookieContainer之外的所有字符串。 – firebellys

+0

在'ApplicationState'中提供类型的元数据可能会有所帮助。 –

回答

2

听起来好像你在自动序列化的一个类型中有一个Encoding(或UTF8Encoding)变量,以便你的应用程序可以恢复。看看你的代码,看看有没有像这样的变量。如果有的话,下一步是确定你是否真的需要这些变量。

+0

我看到的是WMApp清单中的唯一位置,这不是我要编辑的东西。 <?xml version =“1.0”encoding =“utf-8”?>。当我退出时,哪些变量会被序列化?它是否仍然存在并在范围内? – firebellys

+0

我要说的是,当我从一个页面移动到另一个页面时,我存储了一些复杂的项目。我在上面发布答案。 – firebellys

0

当墓碑化时,ApplicationState被序列化为DataContractSerializer。这听起来像你正在添加一些不能正确去序化的东西。
有2个替代的:

  1. 确保无论你节省可以通过DataContractSerializer正确地反序列化。
  2. 自己处理序列化和反序列化(使用比DataContractSerializer更快的东西,比如json.net),并只将序列化的字符串添加到状态对象中。
+0

有没有办法从调试器获得更多反馈,以确定哪些文本或对象实际上导致了它?假设我有大约6个具有20-30个属性的对象,可能很难判断哪个是罪魁祸首。我现在有我的怀疑。其次,如果在应用程序关闭或唤醒时发生这种情况,我该如何替换某些东西的序列化方式。我从来没有看到这在运行时,只有当应用程序关闭。 – firebellys

+0

我建议你自己串行化,因为这样更容易调试。如果你真的想在墓碑上序列化东西,你必须使用'Activated'和'Deactivated'事件来交换状态的内容。总是将序列化更复杂的对象可能会更容易。 –