当前位置: 首页 > 知识库问答 >
问题:

Gson:java.lang.堆栈溢出错误:null

谷奕
2023-03-14

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

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

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]

请帮助其中的错误

共有1个答案

弘兴言
2023-03-14

问题是Scala枚举的字节码包含一个可能值的集合,每个值都是枚举的一个实例

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

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

我们可以看到Java反汇编包含类型为枚举$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枚举都包含循环引用。对此最简单的解决方案是注释<code>@transient</code>等字段(https://stackoverflow.com/a/14489534/323177). 不幸的是,由于我们无法为您的自定义Scala<code>Enumeration</code>注释生成的字节码,因此解决方案是创建一个自定义GSON序列化程序,将枚举值手动序列化为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 对象期间将其注册为类型适配器,然后这将序列化枚举值。

Gson gson = new GsonBuilder()
    .registerTypeAdapter(Enumeration.Value.class, new GsonScalaEnumerationSerializer())
    .create();
 类似资料:
  • 问题内容: 下面给出的代码显示了运行时的Stackoverflow错误。但是,如果我使另一个类CarChange创建Car的对象,它将成功运行。我是一个初学者,请执行以下代码以了解在Java中进行向上转换的重要性。 问题答案: 一个stackoverflow通常意味着您有一个无限循环。 收到此消息的原因是因为您从testdrive方法调用驱动器,并且在该方法中再次调用drive。

  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码:

  • 我有一个文件解析器代码,偶尔会在m.matches()上出现堆栈溢出错误(其中m是匹配器)。 我再次运行我的应用程序,它解析相同的文件,没有堆栈溢出。 我的模式确实有点复杂。它基本上是一组可选的零长度正lookahead,其中包含命名组,这样我就可以匹配一组变量名/值对,而不考虑它们的顺序。但我认为,如果某个字符串会导致堆栈溢出错误,它总是会导致它。。。不只是有时候。。。有什么想法吗? 我的模式

  • 问题内容: TL; DR: 将任何非内置函数添加到Array.prototype AND Function.prototype将导致IE8本机JSON解析器在解析包含数组的任何JSON时发生堆栈溢出,但仅当您还传递了reviver函数时放入JSON.parse()。 最初这是一个问题,但我回答了我自己的原始问题,所以现在我要问:有人能想到此IE8错误的解决方法,该方法不涉及消除所有修改Array.

  • 我有一个名为User的实体,它有一组角色。我还有一个角色实体,它有一组用户。(这只是出于学习目的的实践应用。) 问题是——我有一个UserController(REST API)来发送用户列表——这会导致StackOverFlow错误。用户试图加载角色,而角色又试图加载用户等。 我的问题是——如何避免这种情况?我也看到许多类似的设计。例如:https://viralpatel.net/blogs/

  • 问题内容: 我正在运行一个用Java在Eclipse中编写的程序。对于很大的输入,该程序具有很深的递归级别。对于较小的输入,程序运行正常,但是在给出较大的输入时,出现以下错误: 可以通过增加Java堆栈大小来解决此问题,如果可以,那么如何在Eclipse中做到这一点? 更新: @乔恩·斯基特 该代码递归地遍历解析树以建立数据结构。因此,例如,代码将使用解析树中的一个节点来做一些工作,并在该节点的两