1. 背景
昨天在写RPC的基础Demo的时候,使用JSON作为序列化方式,然后在序列化对象的时候,报错了。
我复现一下该报错:
public class GsonTest {
public static void main(String[] args) {
new Gson().toJson(String.class);
}
}
具体错误如下:
Exception in thread "main" java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: java.lang.String. Forgot to register a type adapter?
at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:73)
at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:69)
at com.google.gson.TypeAdapter$1.write(TypeAdapter.java:191)
at com.google.gson.Gson.toJson(Gson.java:704)
at com.google.gson.Gson.toJson(Gson.java:683)
at com.google.gson.Gson.toJson(Gson.java:638)
at com.google.gson.Gson.toJson(Gson.java:618)
at chat.rpc.GsonTest.main(GsonTest.java:13)
2. 解决方法:
main {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Class.class, new ClassTypeAdapter()).
create();
}
// 方式一:继承 TypeAdapter
class ClassTypeAdapter extends TypeAdapter<Class> {
@Override
public void write(JsonWriter out, Class value) throws IOException {
out.value(value.getName());
}
@Override
public Class read(JsonReader in) throws IOException {
String clazzName = in.nextString();
try {
return Class.forNa