Gson:java.lang.StackOverflowError:空 [英] Gson:java.lang.StackOverflowError: null
问题描述
我有一个Delete类,我想使用Gson库将其转换为json,但是当我转换它时,它会抛出java.lang.StackOverflowError: null
的异常
这是我的课
i have a class Delete which i want to convert it into json using Gson library but when i convert it it throws exception of java.lang.StackOverflowError: null
here is my class
import models.UserNotifications.MailMessages.DeleteReason._
import models.UserNotifications.MailMessages.DeleteStatus._
@SerialVersionUID(1)
class Delete extends Serializable {
var deleteStatus : DeleteStatus = DELETED
var deleteReason : DeleteReason = EXPIRED
/*
* Setters
*/
def setDeleteStatus(deletestatus : String)= {
deleteStatus = DeleteStatus.withName(deletestatus)
}
def setDeleteReason ( deletereason : String) ={
deleteReason = DeleteReason.withName(deletereason)
}
/*
* Getter
*/
def getDeleteStatus : DeleteStatus = {
deleteStatus
}
def getDeleteReason : DeleteReason = {
deleteReason
}
}
这是枚举类 DeleteStatus.scala
here is enumeration classes DeleteStatus.scala
object DeleteStatus extends Enumeration {
type DeleteStatus = Value
val DELETED, ACTIVE = Value
}
DeleteReason.scala
DeleteReason.scala
object DeleteReason extends Enumeration{
type DeleteReason = Value
val EXPIRED , MANUALLY_DELETED = Value
}
这是我在Json中进行转换的方式
Here is how i am converting in Json
var delete = new Delete
val gson = new Gson();
val g=gson.toJson(delete)
但它引发以下异常
java.lang.StackOverflowError: null
at com.google.gson.reflect.TypeToken.equals(TypeToken.java:284) ~[gson-2.3.1.jar:na]
at java.util.HashMap.getNode(HashMap.java:571) ~[na:1.8.0_45]
at java.util.HashMap.get(HashMap.java:556) ~[na:1.8.0_45]
at java.util.Collections$SynchronizedMap.get(Collections.java:2584) ~[na:1.8.0_45]
at com.google.gson.Gson.getAdapter(Gson.java:335) ~[gson-2.3.1.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:55) ~[gson-2.3.1.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:99) ~[gson-2.3.1.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:219) ~[gson-2.3.1.jar:na]
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) ~[gson-2.3.1.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:99) ~[gson-2.3.1.jar:na]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:219) ~[gson-2.3.1.jar:na]
请帮助解决其中的问题
推荐答案
问题是Scala枚举的字节码包含可能值的集合-每个值都是枚举的一个实例.
The issue is that the bytecode of a Scala Enumeration contains a collection of the possible values - each of which is an instance of the enumeration.
例如,如果我们在以下计算机上运行javap CoinFaces
:
For example, if we run javap CoinFaces
on:
object CoinFaces extends Enumeration {
type CoinFaces = Value
val Heads, Tails = Value
}
我们可以看到Java反汇编包含类型为Enumeration$Value
的静态字段values
:
we can see that the Java disassembly contains static field values
of type Enumeration$Value
:
public final class CoinFaces {
public static scala.Enumeration$Value Tails();
public static scala.Enumeration$Value Heads();
public static scala.Enumeration$ValueSet$ ValueSet();
public static scala.Enumeration$ValueOrdering$ ValueOrdering();
public static scala.Enumeration$Value withName(java.lang.String);
public static scala.Enumeration$Value apply(int);
public static int maxId();
public static scala.Enumeration$ValueSet values();
public static java.lang.String toString();
}
这意味着从Java开始,所有Scala枚举都包含循环引用.最简单的解决方案是对诸如@transient
( https://stackoverflow.com/a/14489534/323177).不幸的是,由于我们无法为您的自定义Scala Enumeration
注释生成的字节码,因此解决方案是创建一个自定义GSON序列化程序,该序列化程序将枚举值手动序列化为String.
This means that from Java, all Scala enumerations contains cyclical references. The easiest solution to this is to annotate such fields as @transient
(https://stackoverflow.com/a/14489534/323177). Unfortunately, since we cannot annotate the generated bytecode for your custom Scala Enumeration
, the solution is to create a custom GSON serializer that manually serializes the enumeration value as a String.
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import scala.Enumeration;
import java.lang.reflect.Type;
// Scala enumerations are static Java classes with values of type `Enumeration.Value`
public class GsonScalaEnumerationSerializer implements JsonSerializer<Enumeration.Value> {
@Override
public JsonElement serialize(final Enumeration.Value enumValue,
final Type typeOfEnum,
final JsonSerializationContext context) {
return new JsonPrimitive(enumValue.toString());
}
}
然后在构造Gson
对象的过程中将其注册为类型适配器,然后将序列化Enumeration值.
Then register this as a type adapter during construction of your Gson
object and this will then serialise the Enumeration value.
Gson gson = new GsonBuilder()
.registerTypeAdapter(Enumeration.Value.class, new GsonScalaEnumerationSerializer())
.create();
这篇关于Gson:java.lang.StackOverflowError:空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!