以下代码导致StackOverflowError
.代码的目的是从java类创建一个json字符串.
for (ControlTransaction crt : ctrList) { crt= new ControlTransaction();// for test, Still issue final Gson gson = new GsonBuilder().registerTypeAdapter( ControlTransaction.class, new ControlTransactionSerializer()).create(); String jsonControlTransactionString = gson.toJson(crt); strList.add(jsonControlTransactionString); }
我的班级看起来像
public class ControlTransaction implements IsSerializable, Serializable ,IsBean{ private long id; private String value; // H private String lastValue; // H private FormTransaction formTransaction; private ListgridRows; private ControlTransaction referenceGridTransaction; private RowTransaction fkRowTransaction; private ReportTransaction reportTransaction; //getters ... setters }
堆栈跟踪就像这样,让我知道
Caused by: java.lang.StackOverflowError at com.google.gson.stream.JsonWriter.(JsonWriter.java:190) at com.google.gson.internal.bind.JsonTreeWriter. (JsonTreeWriter.java:58) at com.google.gson.Gson.toJsonTree(Gson.java:478) at com.google.gson.Gson$3.serialize(Gson.java:140) at com.nextenders.common.ControlTransactionSerializer.serialize(ControlTransactionJsonUtil.java:129) at com.nextenders.common.ControlTransactionSerializer.serialize(ControlTransactionJsonUtil.java:1) at com.google.gson.TreeTypeAdapter.write(TreeTypeAdapter.java:70) at com.google.gson.Gson.toJson(Gson.java:586) at com.google.gson.Gson.toJsonTree(Gson.java:479) at com.google.gson.Gson$3.serialize(Gson.java:140) at com.nextenders.common.ControlTransactionSerializer.serialize(ControlTransactionJsonUtil.java:129) at com.nextenders.common.ControlTransactionSerializer.serialize(ControlTransactionJsonUtil.java:1) at com.google.gson.TreeTypeAdapter.write(TreeTypeAdapter.java:70) at com.google.gson.Gson.toJson(Gson.java:586) at com.google.gson.Gson.toJsonTree(Gson.java:479) at com.google.gson.Gson$3.serialize(Gson.java:140) at com.nextenders.common.ControlTransactionSerializer.serialize(ControlTransactionJsonUtil.java:129) at com.nextenders.common.ControlTransactionSerializer.serialize(ControlTransactionJsonUtil.java:1) at com.google.gson.TreeTypeAdapter.write(TreeTypeAdapter.java:70) at com.google.gson.Gson.toJson(Gson.java:586) at com.google.gson.Gson.toJsonTree(Gson.java:479) at com.google.gson.Gson$3.serialize(Gson.java:140)
这是我serializer
和deserializer
class ControlTransactionDeserializer implements JsonDeserializer{ @Override public ControlTransaction deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { return context.deserialize(json, type); } } class ControlTransactionSerializer implements JsonSerializer { @Override public JsonElement serialize(ControlTransaction ctr, Type type, JsonSerializationContext context) { return context.serialize(ctr, type); } }
什么在后端发生.我刚刚传递了一个空对象,这意味着新的ControlTransaction()
,仍然无法解析.
a的要点JsonSerializer
是序列化Object的字段,而不是对象本身.但是,您传递的是已经告诉过的对象Gson
序列化.下列
@Override public JsonElement serialize(ControlTransaction ctr, Type type, JsonSerializationContext context) { return context.serialize(ctr, type); }
相当于
@Override public JsonElement serialize(ControlTransaction ctr, Type type, JsonSerializationContext context) { return new GsonBuilder().registerTypeAdapter( ControlTransaction.class, new ControlTransactionSerializer()).create().toJsonTree(ctr); }
我希望你能看到的是进入递归循环.
在JsonSerializationContext
基本的底层结构Gson
对象使用序列化你的对象.当它看到您的类型时ControlTransaction
,它将委托给您的自定义JsonSerializer
.但是你的JsonSerializer
意志会把它发回去,JsonSerializationContext
循环继续.