WCF - 如何将JavascriptSerializer用作我的反序列化程序?

3

我不喜欢DataContractSerializer处理我的字典反序列化的方式。我的方法都返回Stream,我使用JavascriptDeserializer返回我想要的JSON,但这不能帮助我处理一个字典是POST参数之一的情况。

JavascriptSerializer处理字典的方式如下:

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

DataContractSerializer实现了以下功能:
[{"Key":"myKey1", "Value":"myValue1"}, {"Key":"myKey2", "Value":"myValue2"}]

这样做的问题是,我们的Android和iPhone应用程序正在生成本地代码并且我们的AJAX调用失败了。
有没有简单的方法来解决这个问题或绕过Microsoft可怕的字典反序列化?

你重复了问题 https://dev59.com/N13Va4cB1Zd3GeqPE-uP - 请删除其中一个。谢谢 - tom redfern
2个回答

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

这并没有回答我的问题。我需要知道如何反序列化一个字典。这不是一个返回的字典,而是一个客户端应用程序传递给我的字典。DataContract*序列化程序无法处理字典反序列化,因为我们所有的客户端都是使用同样的方式对字典进行序列化的。 - Brandon
https://dev59.com/G1HTa4cB1Zd3GeqPV_Gl - ttomsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接