0

我正在开发一个实现 DotSpatial 选项卡/功能区应用程序的项目。每个选项卡都是一个插件。保存项目时,RaiseSaveRequest 事件处理程序会创建一个字典,该字典通过 e 传递给每个插件的 projectSavedListener。然后在侦听器中,e.dictPackedStates.adds(pluginName, PackState()) 进入每个插件的 PackState(),将自己打包到字典中。因此,整个应用程序的状态保存在 dictPackedStates 字典中,如 pluginName 和每个插件的字典。

我在保存/打开文件时使用 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) 出错。发送的对象是值 { "ProjectName": "test5.vbpx"} 而不是上面保存的字典中的第一项 {[Project Manager, System.Collections.Generic.Dictionary'2[System.String,System.Object] ]}。

我希望这足以解释我的问题。关于如何获取 deserializeObject 以使字典恢复为正确格式的任何建议?非常感谢!!

4

1 回答 1

1

我解决了这个问题(然后找到了我的下一个问题..我将作为一个单独的问题添加)。我更改了包含所有插件打包状态的 pluginStates 字典,Dictionary<string, object>使Dictionary<string, Dictionary<string, object>>保存的 pluginStates(序列化之前)和打开的 pluginStates(反序列化之后)相同。直到我深入到实际的插件解包方法,它没有被正确反序列化。

于 2012-06-08T16:11:56.270 回答