当我尝试和我的应用程序进行逻辑删除时,我在手机上遇到过这种情况。
输入数据合约名称为'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登录等,你可以把它留给手机来处理墓碑。就我而言,我需要一个更强大的系统。
答案 0 :(得分:2)
听起来您的某个类型中有一个Encoding
(或UTF8Encoding
)变量会自动序列化,以便您的应用可以恢复。仔细查看您的代码,看看是否有任何类似的变量。如果有,下一步是弄清楚你是否真的需要这些变量。
答案 1 :(得分:0)
当逻辑删除时,ApplicationState被序列化为DataContractSerializer
。听起来你正在添加一些无法正确解密的东西
有两种选择:
DataContractSerializer
正确地对您保存的内容进行反序列化
或