我正在从事一个实现DotSpatial tab/功能区应用程序的项目。每个选项卡都是一个插件。保存项目时,RaiseSaveRequest 事件处理程序会创建一个字典,该字典通过 e 传递给每个插件的 projectSavedListener。然后在侦听器中,e.dictPackedStates.adds(pluginName,PackState())转到每个插件的PackState(),将自己打包到字典中。因此,整个应用程序的状态保存在 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();
我的呜呜。写入(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]}
然后在开放中,它进入插件状态,信号器。UnpackProject状态发送是:
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"},而不是 {[项目经理,System.Collections.Generic.Dictionary'2[System.String,System.Object]]} 上方保存的字典中的第 1 项。
我希望这足以解释我的问题。关于如何让反序列化对象以正确的格式恢复字典的任何建议?非常感谢!!
我有点解决了这个问题(然后找到了我的下一个问题。我将作为一个单独的问题添加)。我将保存所有插件打包状态的插件状态的 pluginStates 字典从 Dictionary<string, object>
更改为 Dictionary<string, Dictionary<string, object>>
,这使得保存的插件状态(序列化之前)和打开的插件状态(反序列化后)相同。直到我深入研究实际插件的解包方法,该方法未正确反序列化。