在使用JsonConvert.DeserializeObject反序列化自定义对象的时候,我遇到了一个问题。定义了一个对象QueryModel,QueryModel拥有两个构造方法,私有无参构造方法(private QueryModel())跟一个公共构造方法(public QueryModel(String queryModel))。
public class QueryModel
{
private QueryModel()
{
this.Params = new Hashtable();
}
public QueryModel(String queryModel)
{
QueryModel qm = new QueryModel();
try
{
qm = JsonConvert.DeserializeObject<QueryModel>(queryModel);
}
catch (System.Exception ex)
{
throw ex;
}
this.Params = qm.Params;
}
public Hashtable Params { get; set; }
}
但是当在外部调用
new QueryModel(queryModel)
时会重复调用两次构造方法。第一次传入参数是null,第二次才是正常传入的参数。这是为什么呢?
在多次调试代码后,我发现在执行JsonConvert.DeserializeObject的时候会先调用一次构造方法。
经过对Json反序列化的思考。我猜测应该是 JsonConvert.DeserializeObject 内部实现的时候先实例化了一个对象。然后通过反射对Json字符串中的各个属性对对象进行赋值。
因为在外部实例化对象,所以构造方法必须是public的才会被调用,如果没有无参构造方法,JsonConvert.DeserializeObject 则选用带参数的公共构造方法提供默认参数,以完成实例化。
当然,这个只是我的猜测,具体没有研究过源码。若是有兴趣的同学,可以研究下 JsonConvert 的源码。