gpt4 book ai didi

java - Gson:java.lang.StackOverflowError: null

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:41 25 4
gpt4 key购买 nike

我有一个类Delete,我想使用Gson库将其转换为json,但是当我转换它时,它会抛出java.lang.StackOverflowError: null的异常这是我的课

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
}


}

这里是枚举类删除状态.scala

object DeleteStatus extends Enumeration {

type DeleteStatus = Value
val DELETED, ACTIVE = Value

}

删除原因.scala

object DeleteReason extends Enumeration{
type DeleteReason = Value
val EXPIRED , MANUALLY_DELETED = Value
}

这是我如何在 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 枚举的字节码包含可能值的集合 - 每个值都是枚举的一个实例。

例如,如果我们在以下位置运行 javap CoinFaces:

object CoinFaces extends Enumeration {
type CoinFaces = Value
val Heads, Tails = Value
}

我们可以看到 Java 反汇编包含 Enumeration$Value 类型的静态字段 values:

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 序列化程序,手动将枚举值序列化为字符串。

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 对象期间将其注册为类型适配器,然后这将序列化枚举值。

Gson gson = new GsonBuilder()
.registerTypeAdapter(Enumeration.Value.class, new GsonScalaEnumerationSerializer())
.create();

关于java - Gson:java.lang.StackOverflowError: null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31341048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com