2012-04-30 126 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'事件來交換狀態的內容。總是將序列化更復雜的對象可能會更容易。 –