当反序列化的对象没有无参构造函数时,就会出现乱七八糟的现象
据我试验的结果,没有无参数构造函数时,
第一步,应该是先找json字符串中有没有与参数名相同的数值,有的话反序列化构建对象时,填入对应的参数,一旦值做为参数填入,后续反序列化流程不会再使用此值,构造完后,剩下的其他值,看对象有没有相应的名称属性,或字段,有则填入值。 …太复杂了,使用起来非常不方便,非常容易出错。 所以 所有将要使用到 Json反序列化的对象最好都带有无参数构造函数。
下面是验证我结论的试验
1.
public class Pos{
public int x;
public int y;
public Pos(int x){
}
}
由于 构造函数中有x ,但是啥也没做, 构造完后, 还剩下y的值没有用,发现有y字段 则填入其值,所以得到结果x=0,y=11;
2.
public class Pos{
public int x;
public int y;
public Pos(int x){
this.y = x;
}
}
这次我在构造函数中让 x 的值给y, 后面由于json 中 y 的值还未使用 填入字段y,y的值被覆盖,所以得到结果x=0,y=11
3.
public class Pos{
public int x;
public int y;
public Pos(int x, int y){
this.x = x + 1;
this.y = y + 1;
}
}
这次构造函数中两个值都用上了, 并在构造函数中得到为其值+1 所以得到结果 x=11 y=12,
使用无参数构造函数后,在构造对象时,将不会用上任何 json字符串中的值,所以反序列化的对象都可被填入相应的数据。 而不会是json 数据得到破坏。
第二个坑:
在untiy 客户端中,打包成IOS 程序后, 反序列Json的对象如果没有无参数构造函数将会报错,而且还需要在代码中定义一个静态的对象,默认值使用无参数构造函数创建。否则将会运行报错。
第三个坑:
要被序列化成Json对象的数据,其属性,字段值最好不要使用多态,否则反序列化时,将无法得到多态属性,字段的具体对象 .