反转 Open 方法中的保存方法
本文关键字:方法 保存 反转 Open | 更新日期: 2023-09-27 18:36:50
新手。我只是无法弄清楚如何让它反向工作。我有一个保存方法和一个打开方法。救:
IDictionary<string, IDictionary<string, object>> pluginStates = new Dictionary<string, IDictionary<string, object>>();
signaller.RaiseSaveRequest(pluginStates); <--goes out and gets packed plugins
//loop through plugins to get values and types
//holds all of the plugin arrays
Dictionary<string, object> dictProjectState = new Dictionary<string, object>();
foreach (KeyValuePair<string,IDictionary<string,object>> plugin in pluginStates)
{
//holds jsonRepresented values
Dictionary<string, object> dictJsonRep = new Dictionary<string, object>();
//holds object types
Dictionary<string, object> dictObjRep = new Dictionary<string, object>();
object[] arrayDictHolder = new object[2]; //holds all of the dictionaries
string pluginKey = plugin.Key;
IDictionary<string, object> pluginValue = new Dictionary<string, object>();
pluginValue = plugin.Value;
foreach (KeyValuePair<string, object> element in pluginValue)
{
string jsonRepresentation = JsonConvert.SerializeObject(element);
object objType = element.Value.GetType().ToString();
dictJsonRep.Add(element.Key, jsonRepresentation);
dictObjRep.Add(element.Key, objType);
}
arrayDictHolder[0] = dictJsonRep;
arrayDictHolder[1] = dictObjRep;
dictProjectState.Add(pluginKey, arrayDictHolder);
}
JsonSerializer serializer = new JsonSerializer();
using (StreamWriter sw = new StreamWriter(strPathName))
using (JsonWriter writer = new JsonTextWriter(sw))
{
serializer.Serialize(writer, dictProjectState);
}
因此,当有人保存时,事件处理程序会出去并获取每个插件的 packedState,并将其添加到字典插件状态中。然后,我遍历插件状态中的每个插件,将键和 json 字符串版本的值添加到 1 个字典中,将键、对象类型添加到另一个字典中,将这 2 个字典添加到数组中,然后打包一个包含插件键和每个插件的数组的字典。推理:在反序列化时,我遇到了从 JArray 到类型 DataTable 以及字典中的其他类型的问题,这些类型在打开时被传回插件以解压缩自身。我正在尝试弄清楚如何扭转这种情况,以便当用户打开项目时,我有dictProjectState,并且需要将其一直带回代码,最终得到包含插件的1个字典。如何在开放中镜像此保存?谢谢!
当你在 open 函数中反序列化时,你应该得到一个可以强制转换为 Dictionary<string, object>
的对象。
此字典的键将是最终字典中插件的名称(yoru save 方法中的插件键)。 这些值应为object[] arrayDictHolder
对象。 您可以将它们转换为object[]
然后获取其中的两个值(保存函数中的dictJsonRep和dictObjRep)。
一旦这些值都被强制转换为Dictionary<string, object>()
,您就可以循环访问其中一个中的键值对,并使用这些对中的键来获取另一个字典中的值存储。
代码将类似于以下内容:
var pluginStates = new Dictionary<string, IDictionary<string, object>>();
var dictProjectState = jsonSerializer.Deserialize(reader) as Dictionary<string, object>;
foreach(var projectStatePair in dictProjectState)
{
string pluginKey = projectStatePair.Key;
var pluginValues = new Dictionary<string, object>();
object[] arrayDictHolder = projectStatePair.Value as object[];
var dictJsonRep = arrayDictHolder[0] as Dictionary<string, object>;
var dictObjRep = arrayDictHolder[1] as Dictionary<string, object>;
foreach(var JsonRepPair in dictJsonRep)
{
string jsonRepresentation = JsonRepPair.Value;
// We know both dictionaries have the same keys, so
// get the objType for this JsonRepresentation
object objType = dictObjRep[JsonRepPair.Key];
// Since you're serializing objType to a string, you'll need
// to get the actual Type before calling DeserializeObject.
Type jsonType = System.Type.GetType(objType as string);
object value = JsonConvert.DeserializeObject( jsonRepresentation, jsonType );
pluginValues.Add( JsonRepPair.Key );
}
pluginStates.Add( pluginKey, pluginValues );
}
注意:您当前在保存函数中将 objType 设置为element.Value.GetType().ToString();
。 在尝试反序列化之前,您需要更新 save() 以将其设置为 element.Value.GetType();
,或者将类型字符串转换回实际类型。
注意:我对 Json 库不是很熟悉。 上面的代码侧重于从反序列化结果中创建插件状态字典。 您需要处理 JsonSerializer 的创建,并确保在反序列化后关闭所有流。 您可能还需要调整实际的反序列化调用以获得所需的结果。
更新:添加了将 objType 转换为实际的 System.Type 对象。