2012-06-07 273 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(在反序列化之后)相同。直到我深入到实际的插件的解包方法,这是不正确的反序列化。