【问题标题】:StackOverflowError when using JsonSerializer with Gson and Scala将 JsonSerializer 与 Gson 和 Scala 一起使用时出现 StackOverflowError
【发布时间】:2014-03-15 14:26:42
【问题描述】:

我正在尝试在一个简单的测试中使用 Gson 和 Scala。这在打印作者实例时工作正常,我正在接收作者的 json 表示。但是,当用 book 实例替换它时,我得到了 StackOverflowError。我在other places 中读到,如果类之间存在循环引用,则可能会发生这种情况,但我在这里看不到。我在下面附上了代码和错误堆栈的一部分,并感谢有关如何解决此问题的任何建议。

代码:

import com.google.gson._
import java.lang.reflect.Type
import scala.collection.mutable._

object GsonTest extends App {
  val gsonBuilder = new GsonBuilder
  gsonBuilder.registerTypeAdapter(classOf[Author], new AuthorSerializer)
  gsonBuilder.registerTypeAdapter(classOf[Book], new BookSerializer)

  val book = Book("test book")
  val author = Author("test author")
  book.authors += author

  val gson = new Gson
  println(gson.toJson(author))
  println(gson.toJson(book))
}

case class Author(name: String)

case class Book(name: String) {
  val authors = MutableList[Author]()
}

class AuthorSerializer extends JsonSerializer[Author] {
  override def serialize(src: Author, typeOfSrc: Type, context: JsonSerializationContext) = {
    val json = new JsonObject
    json.addProperty("name", src.name)
    json
  }
}

class BookSerializer extends JsonSerializer[Book] {
  override def serialize(src: Book, typeOfSrc: Type, context: JsonSerializationContext) = {
    val json = new JsonObject
    json.addProperty("name", src.name)

    val jsonAuthorArray = new JsonArray
    for (author <- src.authors) {
      jsonAuthorArray.add(context.serialize(author))
    }
    json.add("authors", jsonAuthorArray)
    json
  }
}

错误堆栈:

Exception in thread "main" java.lang.StackOverflowError
    at com.google.gson.reflect.TypeToken.equals(TypeToken.java:284)
    at java.util.HashMap.getNode(HashMap.java:578)
    at java.util.HashMap.get(HashMap.java:556)
    at java.util.Collections$SynchronizedMap.get(Collections.java:2644)
    at com.google.gson.Gson.getAdapter(Gson.java:332)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:55)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
    ...and so on

【问题讨论】:

    标签: scala gson


    【解决方案1】:

    您缺少gsonBuilder.create(),因此类型适配器未正确注册:

      val gsonBuilder = new GsonBuilder
      gsonBuilder.registerTypeAdapter(classOf[Author], new AuthorSerializer)
      gsonBuilder.registerTypeAdapter(classOf[Book], new BookSerializer)
    
      val book = Book("test book")
      val author = Author("test author")
      book.authors += author
    
      val gson = gsonBuilder.create() // this line !!!
      println(gson.toJson(author))
      println(gson.toJson(book))
    

    【讨论】:

    • 非常感谢!错过了这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多