【发布时间】:2015-10-30 13:15:45
【问题描述】:
我有一个用于配置的类,它包含所有整数的 3 个元组。
public class Configuration
{
public List<Tuple<int, int, int>> MyThreeTuple { get; set; }
public Configuration()
{
MyThreeTuple = new List<Tuple<int, int, int>>();
MyThreeTuple.Add(new Tuple<int, int, int>(-100, 20, 501));
MyThreeTuple.Add(new Tuple<int, int, int>(100, 20, 864));
MyThreeTuple.Add(new Tuple<int, int, int>(500, 20, 1286));
}
}
这个类被序列化为带有System.Web.Script.Serialization的Json
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
String configJson = jsonSerializer.Serialize(config);
File.WriteAllText(configPath, configJson);
然后在应用启动时反序列化
String configJson = File.ReadAllText(configPath);
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
object jsonObject = jsonSerializer.Deserialize(configJson, typeof(ApplicationConfiguration));
appConfig = (Configuration)jsonObject;
我的问题是每当我去反序列化 Json 时都会引发异常
System.MissingMethodException in System.Web.Extensions.dll
有消息
No parameterless constructor defined for type of `System.Tuple`3 ....
这是为元组生成的 Json 的样子
"MyThreeTuple":
[
{"Item1":-100,"Item2":20,"Item3":501},
{"Item1":100,"Item2":20,"Item3":864},
{"Item1":500,"Item2":20,"Item3":1286}
]
知道如何解决这个问题吗?
编辑:
正如其他人建议的那样,我尝试了 JSon.NET,它似乎可以反序列化 json。虽然我发现了一个奇怪的怪癖。
所以我的Configuration 类的构造函数填充了配置的默认值。特别是上面代码中给出的内容。我发现我可以用不同的值对配置进行序列化,但是在反序列化时,默认值也会加载到List<Tuple<>>。
我假设 Json.Net 通过首先实例化 Configuration 然后设置其值来解决 Tuple 没有无参数构造函数的问题。
它似乎正在实例化该类,然后 List.Adding 将它在 json 中找到的 Tuples 添加到列表中。而不是清除列表然后添加它找到的内容。
JSon.Net 中有解决此问题的选项吗?
【问题讨论】:
-
Systen.Tuple 根本没有无参数构造函数。
-
如果你愿意使用 JSON.net,那就supports Tuple serialization。
-
我在上面对JSon.Net的使用进行了编辑。
-
检查我的答案我用一个简单的 [JsonIgnore] 解决了这个问题
标签: c# json serialization json.net javascriptserializer