0

DotSpatialタブ/リボンアプリケーションを実装するプロジェクトに取り組んでいます。各タブはプラグインです。プロジェクトが保存されると、RaiseSaveRequestイベントハンドラーがディクショナリを作成し、eを介して各プラグインのprojectSavedListenerに渡されます。次に、リスナー内で、各プラグインのPackState()に移動するe.dictPackedStates.adds(pluginName、PackState())が、自身を辞書にパックします。したがって、アプリケーション全体の状態は、各プラグインのディクショナリであるpluginNameの時点でdictPackedStatesディクショナリに保存されます。

保存/開いたときにファイルをシリアル化/逆シリアル化するためにJSON.NETを使用しています。保存は正常に機能していると思います。

Dictionary<string, object> pluginStates = new Dictionary<string, object>();
signaller.RaiseSaveRequest(pluginStates);

//JSON
string json = JsonConvert.SerializeObject(pluginStates);
StreamWriter sw = new StreamWriter(strPathName); 
sw.Write(json);
sw.Close();

私のsw.Write(json); JSONをファイルに書き込んでいるようです。ファイルを開いてすべてを見ることができます。それから私のオープンで、私は持っています:

Dictionary<string, object> pluginStates = new Dictionary<string, object>();

//JSON
StreamReader sr = new StreamReader(fullName);
string json = sr.ReadToEnd();
pluginStates = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
sr.Close();

signaller.UnpackProjectState(pluginStates);

私のpluginStatesは、シリアル化される前と同じ方法ではありません。それらが保存されると、辞書は次のようになります:(ここにどのように見えるかを示す写真が必要です。方法がわかりません)。

pluginStates  Count=5, 
(hit plus, 1st entry) [0] {[Project Manager, System.Collections.Generic.Dictionary'2[System.String,System.Object]]}
(hit plus on that entry) Key  "Project Manager" Value  Count =1
(hit plus on value) [0]  {[ProjectName, test5.vbpx]}

次に、オープンで、signaller.UnpackProjectStateが送信するPluginStatesを取得します。

pluginStates  Count=5 
(hit plus, 1st entry)  [0] {[Project Manager, { "ProjectName": "test5.vbpx"}]}
(hit plus)  Key  "Project Manager"  Value  { "ProjectName": "test5.vbpx"}
(hit plus on value) .. first thing is base {Newtonsoft.Json.Linq.Jcontainer}

これにより、最初のプラグインのUnpackState(object objPackedState)でエラーが発生します。送信されるオブジェクトは、{[Project Manager、System.Collections.Generic.Dictionary'2 [System.String、System.Object]の上の保存された辞書の最初の項目ではなく、値{"ProjectName":"test5.vbpx"}です。 ]}。

それが私の問題を十分に説明したことを願っています。deserializeObjectを取得して辞書を正しい形式に戻す方法に関する提案はありますか?本当にありがとう!!

4

1 に答える 1

1

私は問題を修正しました(そして次の問題を見つけました。これを別の質問として追加します)。プラグインのパックされた状態をすべて保持するpluginStatesディクショナリを変更してDictionary<string, object>Dictionary<string, Dictionary<string, object>>保存されたpluginStates(シリアル化前)と開いたpluginStates(逆シリアル化後)を同じにしました。正しく逆シリアル化されていない実際のプラグインのUnpackメソッドを掘り下げるまで。

于 2012-06-08T16:11:56.270 に答える