2011-12-05 7 views
3

DataContractSerializerが辞書の逆シリアル化をどのように処理するのが好きではありません。私のメソッドはすべてストリームを返し、私は必要なJSONを返すためにJavascriptDeserializerを使いますが、これはDictionaryがPOSTパラメータの1つであることを助けません。WCF - 私のデシリアライザとしてJavascriptSerializerを使用する方法?

{"myKey1":"myValue1", "myKey2":"myValue2"} 

DataContractSerializerはこの行います:

JavascriptSerializerは辞書のようにのように扱う

[{"Key":"myKey1", "Value":"myValue1"}, {"Key":"myKey2", "Value":"myValue2"}] 

これに伴う問題は、私たちのアンドロイドで、iPhoneアプリは、ネイティブコードを生成吐いと私たちのAJAXされていますコールが失敗しています。

これを行う簡単な方法や、Microsoftのひどい辞書の逆シリアル化を回避する方法はありますか?

+0

あなたの質問http://stackoverflow.com/questions/8372076/wcf-post-json-dictionary-without-key-value-textを重複している - そのうちの一つを削除してください。ありがとう –

答えて

0
+0

これは私の質問に答えません。私はどのように辞書を非直列化するかを知る必要があります。これは返された辞書ではなく、クライアントアプリケーションによって私に渡される辞書です。 DataContract *シリアライザは、すべてのクライアントがディクショナリをシリアル化する方法で、ディシリアライズのディシリアライズを処理しません。 – Brandon

+0

http://stackoverflow.com/questions/4199321/how-to-deserialize-a-dictionary-using-datacontractjsonserializer – ttomsen

2

私は同じ問題を抱えていました。私はISerializableを実装しているカスタムディクショナリ(実際にはラッパー)を使って解決しました。

[Serializable] 
public class CustomDictionary: ISerializable 
{ 
    /// <summary> 
    /// Inner object. 
    /// </summary>   
    private Dictionary<string, string> innerDictionary; 

    public CustomDictionary() 
    { 
     innerDictionary = new Dictionary<string, string>(); 
    } 

    public CustomDictionary(IDictionary<string, string> dictionary) 
    { 
     innerDictionary = new Dictionary<string, string>(dictionary); 
    } 

    public Dictionary<string, string> InnerDictionary 
    { 
     get { return this.innerDictionary; } 
    } 

    //Used when deserializing 
    protected CustomDictionary(SerializationInfo info, StreamingContext context) 
    { 
     if (object.ReferenceEquals(info, null)) throw new ArgumentNullException("info"); 
     innerDictionary = new Dictionary<string, string>(); 
     foreach (SerializationEntry entry in info) 
     { 
      innerDictionary.Add(entry.Name, entry.Value as string); 
     } 
    } 

    //Used when serializing 
    protected virtual void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     if (!object.ReferenceEquals(info, null)) 
     { 
      foreach (string key in innerDictionary.Keys) 
      { 
       string value = innerDictionary[key]; 
       info.AddValue(key, value); 
      } 
     } 
    } 

    //Add methods calling InnerDictionary as necessary (ContainsKey, Add, etc...) 
} 
+0

私は似たような解決策を見ました。 –

関連する問題