Gson:java.lang.StackOverflowError: null

2023-12-03

我有一个类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 on:

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

我们可以看到Java反汇编包含静态字段values类型的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 序列化器,手动将枚举值序列化为字符串。

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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gson:java.lang.StackOverflowError: null 的相关文章

  • java 中的梵文 i18n

    我正在尝试使用来自互联网的示例 ttf 文件在 java 中使用 i18n 进行梵文 印地文 我可以加载资源包条目 还可以加载 ttf 并设置字体 但它不会根据需要呈现 jlabel 它显示块代替字符 如果我在 Eclipse 中调试 我可
  • Java 小程序在 Mac 上闪烁

    这个问题很奇怪 问题并非在每个平台上都会发生 我在使用 MacOSX 的 Google Chrome 中出现了这种情况 但在 Safari 中却没有出现这种情况 对于使用 Windows 的朋友来说 在 Google Chrome 上运行得
  • 如何从 Java 访问 Windows 设备管理器中的信息?

    我有一个串行 USB 设备 并且其中多个设备可以连接到计算机 我需要查询和检索设备连接到的 COM 端口列表 在 Windows 设备管理器中 您可以获得当前连接的设备的 COM 端口 友好名称 该列表是动态的 从注册表中读取不工作 htt
  • 按升序对 NSDictionary 进行排序

    我正在尝试排序NSDictionary按升序排列 我正在使用这段代码 NSDictionary valDict self mGetDataDict key rowKey for NSString valueKey in valDict al
  • Java Junit 测试 HTTP POST 请求

    我需要测试以下方法而不改变方法本身 该方法向服务器发出 POST 方法 但我需要制作一个独立于服务器的测试用例 在将其重定向到本地文件之前 我测试了类似的方法 但为此我将协议指定为文件 主机名指定为 localhost 端口指定为 1 我的
  • Scala REPL / SBT Console 是否有配置文件?

    我一直在尝试找到某种点文件来放入 Scala REPL 设置和自定义函数 我特别有兴趣传递它的标志 例如 Dscala color 启用语法突出显示 以及覆盖设置 如结果字符串截断 scala gt power scala gt vals
  • Maven WebApp META-INF context.xml

    我正在使用 Maven 3 并且尝试在 webapp 文件夹下添加 META INF 文件夹 所以我正在尝试执行以下操作 src main webapp META INF context xml WEB INF 下面是我的 POM 文件
  • 如何避免Eclipse在将类名放在注释中时导入类,以便checkstyle稍后不会抱怨?

    有时我将类名放在方法或类的注释中只是为了引用 但是 Eclipse 会自动执行导入并在文件中留下导入语句 这会导致稍后出现 未使用的导入 检查样式错误 当我在注释中输入类名时 是否可以更改一些配置以避免 Eclipse 自动导入 人们不同意
  • FileObserver 不适用于 Android 6.0 Marshmallow (API 23) 中的外部存储

    我有一个应用程序可以观察外部存储上的公共目录FileObserver 它运行良好Lollipop设备 我想添加对Marshmallow 所以我用它设置了一台 Nexus 9 平板电脑 在 Marshmallow 设备上 它失败 在 Loll
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • 如何自动转换十六进制代码以将其用作 Java 中的 byte[]?

    我这里有很多十六进制代码 我想将它们放入 Java 中 而不需要向每个实体附加 0x 喜欢 0102FFAB 和我必须执行以下操作 byte test 0x01 0x02 0xFF 0xAB 我有很多很长的十六进制代码 有什么办法可以自动做
  • 但是创建静态实用方法不应该被过度使用吗?如何避免呢? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着时间的推移 java项目中引入了许多实用方法来完成更复杂和简单的任务 当使用静态方法时 我们在代码中引入了紧密耦合 这使得我们的代
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • Janusgraph 0.3.2 + HBase 1.4.9 - 无法设置 graph.timestamps

    我在 Docker 容器中运行 Janusgraph 0 3 2 并尝试使用运行 HBase 1 4 9 的 AWS EMR 集群作为存储后端 我可以运行 gremlin server sh 但如果我尝试保存某些内容 我会得到粘贴在下面的堆
  • 如何向数据框spark添加标题和列?

    我有一个数据框 我想在其中添加标题和第一列 手动 这是数据框 import org apache spark sql SparkSession val spark SparkSession builder master local appN
  • Spring - 如何在不匹配列名的情况下使用 BeanPropertyRowMapper

    我正在开发一个应用程序 该应用程序已使用行映射器从纯 JDBC 转换为 Spring 模板 我遇到的问题是数据库中的列与属性名称不匹配 这阻止我使用BeanPropertyRowMapper容易地 我看到一些关于在查询中使用别名的帖子 这会
  • Java 中序列化的目的是什么?

    我读过很多关于序列化的文章 以及它如何如此美好和伟大 但没有一个论点足够令人信服 我想知道是否有人能真正告诉我通过序列化一个类我们真正可以实现什么 让我们先定义序列化 然后我们才能讨论它为什么如此有用 序列化只是将现有对象转换为字节数组 该
  • mysql_query 保留返回时在表中创建的数据类型?

    我在mysql中有一个表 CREATE TABLE user id INT name VARCHAR 250 我查询表 result mysql query SELECT id name FROM user 我收集结果 while row
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 如何在J2ME中获取数字的幂[重复]

    这个问题在这里已经有答案了 可能的重复 J2ME power double double 数学函数实现 https stackoverflow com questions 2076913 j2me powerdouble double ma

随机推荐