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、RuntimeTypeHandledeclaredTypeHandle)
..。

System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegatorライター、オブジェクトグラフ)で

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、String key、IDictionary`2辞書、IEnumerable`1 knownTypes)で

Microsoft.Phone.Shell.PhoneApplicationService.FireDeactivate()で

Microsoft.Phone.Execution.NativeEmInterop.FireOnPause()で

このようなものをデバッグするにはどうすればよいですか?

解決策:簡単ではありませんが、デバッグメニューで例外を有効にすることから始めます。次に、shift + f9を使用していくつかの値を試し、原因を確認します。最終的な答えは、アプリがこのようなもので閉じる前に状態をクリアすることです。

Application_Deactivated or Closing(){
            SerializeToPhone(); //save state to phone manually
            var appService = PhoneApplicationService.Current;
            appService.State.Clear();
}

このようにして、オブジェクトをクリアして、電話が状態を管理しようとしないようにします。カスタムシリアライザーを使用して電話に状態を保存し、再アクティブ化時に電話から読み取るための独自のコードを追加しました。アプリが十分に単純で、WebセキュリティやFacebookログインなどがない文字列と数字だけであれば、墓石を処理するために電話に任せることができると思います。私の場合、より堅牢なシステムが必要でした。

4

2 に答える 2

2

アプリを復元できるように、タイプの1つに(または)変数が自動的にシリアル化されているようですEncodingUTF8Encodingコードを調べて、そのような変数がどこかにあるかどうかを確認してください。ある場合、次のステップは、それらの変数が本当に必要かどうかを判断することです。

于 2012-04-30T18:54:01.427 に答える
0

ApplicationStateはDataContractSerializer、トゥームストーンされたときにシリアル化されます。正しく非現実化できないものを追加しているようです。
これには2つの選択肢があります。

  1. DataContractSerializer保存しているものがすべて正しく逆シリアル化できることを確認してください。
    また
  2. シリアル化と逆シリアル化を自分で処理し(json.netなどのDataContractSerializerよりも高速なものを使用して)、シリアル化された文字列のみを状態オブジェクトに追加します。
于 2012-05-01T21:18:40.120 に答える