2012-06-07 199 views
0

我正在實施DotSpatial選項卡/功能區應用程序的項目。每個標籤都是一個插件。當項目被保存時,RaiseSaveRequest事件處理程序創建一個字典,通過e傳遞給每個插件的projectSavedListener。然後在偵聽器中,每個插件的PackState()都會將e.dictPackedStates.adds(pluginName,PackState())打包成一個字典。因此,整個應用程序的狀態保存在dictPackedStates字典中,作爲pluginName,每個插件的字典。JSON序列化/反序列化爲包含字典的字典

我使用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 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]} 

然後在打開的,它得到的PluginStates的信號機.UnpackProjectState發送關是:

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(對象objPackedState)。發送的對象是{「ProjectName」:「test5.vbpx」}的值,而不是上面保存的字典中的第一項{{Project Manager,System.Collections.Generic.Dictionary'2 [System.String,System.Object] ]}。

我希望能夠解釋我的問題。有關如何讓deserializeObject以正確格式返回字典的建議? 非常感謝!

+0

我認爲我正在解決問題的正確途徑。具有key:pluginName&value:packedDictionary的主字典被設置爲字典。我將其改爲字典<字符串,字典<字符串,對象>。現在,我收到一條錯誤消息:無法投射類型爲'Newtonsoft.Json.Linq.JArray'的對象在第一個插件中鍵入'System.Data.DataTable',我試圖重新填充它的狀態:this.dt =(DataTable)dictPluginState [「DT」];我有字典進入UnpackState ..解壓縮(字典<字符串,對象> dictPluginState。任何建議? –

回答

1

我有點解決了這個問題(然後發現我的下一個問題,我將作爲一個單獨的問題添加)。我更改了pluginStates字典,它將所有插件的打包狀態從Dictionary<string, object>保存到Dictionary<string, Dictionary<string, object>>,這使得保存的插件狀態(在序列化之前)和打開的pluginState(在反序列化之後)相同。直到我深入到實際的插件的解包方法,這是不正確的反序列化。