JavaScriptSerializer:无法反序列化包含 HashSet 字段的对象。

3

我正在尝试使用JavaScriptSerializer从JSON字符串反序列化以下类的实例:

public class Filter
{
    public HashSet<int> DataSources { get; set;  }
}

这是我正在尝试的代码:

以下是正在测试的代码:

        Filter f = new Filter();

        f.DataSources = new HashSet<int>(){1,2};

        string json = (new JavaScriptSerializer()).Serialize(f);         

        var g= (new JavaScriptSerializer()).Deserialize<Filter>(json);

出现以下错误:

无法将类型为 'System.Collections.Generic.List1[System.Int32]' 的对象转换为类型 'System.Collections.Generic.HashSet1[System.Int32]'。

显然,序列化程序无法从JSON表示中区分列表和集合。 有什么解决方法?

注意:由于工作限制,我更喜欢避免使用外部库。

2个回答

4
这该怎么解决呢?使用Json.Net。以下代码可行...
Filter f = new Filter();

f.DataSources = new HashSet<int>() { 1, 2 };

string json = JsonConvert.SerializeObject(f);

var g = JsonConvert.DeserializeObject<Filter>(json);

编辑

DataContractJsonSerializer 也可以使用...

DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(Filter));
var g2 = dcjs.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(json))) as Filter;

2
谢谢!但我的工作要求我避免使用外部库。任何使用 .net 内置库的解决方案都将非常有帮助。 - Aadith Ramia
@I4V DataContractJsonSerializer表现很好。谢谢! - David Sherret

0
这是我的简单但不太好的解决方案,但它能正常工作。
var dataList = new JavaScriptSerializer().Deserialize<List<int>>(returnData);
var data = new HashSet<int>(dataList);

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