0

プログラミングはかなり新しい。これを逆に機能させる方法に頭を悩ませることはできません。saveメソッドとopenメソッドがあります。保存する:

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を取得し、それをディクショナリpluginStatesに追加します。次に、pluginStatesの各プラグインを調べ、値のキーとjson文字列バージョンを1つの辞書に追加し、キー、オブジェクトタイプを別の辞書に追加し、それらの2つの辞書を配列に追加してから、 pluginKeyと各プラグインの配列。理由:逆シリアル化するときに、JArrayからタイプDataTableや、プラグインに戻されて開いたときにそれ自体を解凍する辞書内の他のタイプに移行する際に問題が発生します。これを元に戻す方法を理解しようとしているので、ユーザーがプロジェクトを開いたときにdictProjectStateがあり、プラグインを含む1つの辞書を作成するためにコード全体に戻す必要があります。この保存をオープンにミラーリングするにはどうすればよいですか?ありがとう!

4

1 に答える 1

0

open関数で逆シリアル化すると、にキャストできるオブジェクトを取得する必要があると思いますDictionary<string, object>

この辞書のキーは、最終的な辞書のプラグインの名前になります(yoru saveメソッドのpluginKey)。値はobject[] arrayDictHolderオブジェクトである必要があります。それらをキャストしてobject[]、内部の2つの値(保存関数のdictJsonRepとdictObjRep)を取得できます。

これらの値が両方にキャストされるとDictionary<string, object>()、一方のKeyValuePairsを反復処理し、それらのペアのキーを使用して、もう一方のディクショナリの値ストアを取得できます。

コードは次のようになります。

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 );
}

注:element.Value.GetType().ToString();現在、保存関数でobjTypeをに設定しています。デシリアライズを試みる前に、 save()を更新して設定するelement.Value.GetType();か、タイプ文字列を実際のタイプに戻す必要があります。

注:私はJsonライブラリにあまり精通していません。上記のコードは、逆シリアル化された結果からpluginStatesディクショナリを作成することに焦点を当てています。JsonSerializerの作成を処理し、ストリームを逆シリアル化した後は必ずストリームを閉じる必要があります。目的の結果を得るには、実際の逆シリアル化呼び出しを微調整する必要がある場合もあります。

更新: objTypeの実際のSystem.Typeオブジェクトへの変換が追加されました。

于 2012-06-12T13:54:30.360 に答える