最难调的Bug-序列化引起的血案
描述由于我利用Gson和ActiveAndroid来保存数据,之前已经能顺利保存各种自定义类型。今天添加一种新的List自定义类型,之后Sqlite疯狂报错,插入出现键重复: 调试怀疑是序列化出了问题,因为我改过这里。 public class ListStringSerializer extends TypeSerializer {
@Override
public Class<?> getDeserializedType() {
return List.class;
}
@Override
public Class<?> getSerializedType() {
return String.class;
}
@Override
public String serialize(Object o) {
// List<String> List<AtUser> List和T均可直接toString
if (o == null) {
return null;
}
// Log.i("ListStringSerializer",o.toString());
return o.toString();
}
@Override
public List<String> deserialize(Object o) {
if (o == null) {
return null;
}
Log.i("ListStringSerializer","deserialize:" + o.toString());
List<String> ret = null;
try {
ret = new Gson().fromJson((String) o,new TypeToken<List<String>>() {
}.getType());
} catch (Exception ex) {
Log.e("ListStringSerializer",Log.getStackTraceString(ex));
}
Log.i("ListStringSerializer","deserialize ret:" + ret);
return new Gson().fromJson((String) o,new TypeToken<List<String>>() {}.getType());
}
}
这下终于报错了: 这是原来的序列化代码: import android.util.Log;
import com.activeandroid.serializer.TypeSerializer;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.List;
public class ListStringSerializer extends TypeSerializer {
@Override
public Class<?> getDeserializedType() {
return List.class;
}
@Override
public Class<?> getSerializedType() {
return String.class;
}
@Override
public String serialize(Object o) {
if (o == null) {
return null;
}
return new Gson().toJson(o); // ["string"]
}
@Override
public List<String> deserialize(Object o) {
if (o == null) {
return null;
}
return new Gson().fromJson((String) o,new TypeToken<List<String>>(){}.getType());
}
}
我今天蛋疼的把这里改了: @Override
public String serialize(Object o) {
if (o == null) {
return null;
}
return o.toString(); // [string]
}
Gson对Json的语法检查还是很严格的,toString导致括号内的String少一对引号,所以不能被识别为String类型。 总结这个Bug之所以难调,是因为数据库里面有残留的错误格式的数据,导致Select一直为Null。我最开始就了怀疑这里,就把代码改回原样子,只是当时没有把数据库删除,导致残留数据无法select,发现Bug依然存在。就把这里排除掉了。真是没想到为啥ActiveAndroid对这里的异常不打Log,其他地方都打了。 最蛋疼的Java编程风格就是一个try-catch把异常都吃了,搞得出问题无从调试。所以宁愿每个函数后面都带throw也不要自己在中间过程的函数中吃了异常。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |