反转 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 方法中的保存方法

我相信

当你在 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 对象。