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

使用GSON将EMF对象序列化为JSON时出现堆栈溢出错误

狄海
2023-03-14

我一直在尝试使用Gson将EMF(Eclipse建模框架)模型对象序列化到Json。然而,我遇到了堆栈溢出错误,当类的包含属性设置为true时,这种错误似乎会发生。他们在EMF模型上使用GSON有任何已知的限制吗?

下面链接的是我尝试序列化的(相当简单的)EMF 模型。请注意,如果我将 Chip 中“子块”的包含属性设为 false(在这种情况下,JSON 会正确生成),则不会发生错误:

我的EMF模型

数据被实例化,Gson编写器调用如下:

 Chip createChip = PackageFactory.eINSTANCE.createChip();
    createChip.setChipName("hello");
    createChip.setChipDesc("helloworld");;
    subBlockFields createsubBlockFields = PackageFactory.eINSTANCE.createsubBlockFields();
    createsubBlockFields.setField1("this is field1");
    createsubBlockFields.setField2("this is field 2");
    subBlock createsubBlock = PackageFactory.eINSTANCE.createsubBlock();
    createsubBlock.setAge(3);
    createsubBlock.setFieldName("this is subblock");
    createsubBlock.setFields(createsubBlockFields);
    createChip.getSubblocks().add(createsubBlock);
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String jsonpp = gson.toJson(createChip);
    try{
    FileWriter writer  = new FileWriter ("C:\\Temp\\emftry.json");
    writer.write(jsonpp);
    writer.close();
    }

堆栈跟踪:

Exception in thread "main" java.lang.StackOverflowError
       at java.util.LinkedHashMap$LinkedHashIterator.<init>(LinkedHashMap.java:366)
       at java.util.LinkedHashMap$LinkedHashIterator.<init>(LinkedHashMap.java:366)
        at java.util.LinkedHashMap$ValueIterator.<init>(LinkedHashMap.java:408)
at java.util.LinkedHashMap$ValueIterator.<init>(LinkedHashMap.java:408)
at java.util.LinkedHashMap.newValueIterator(LinkedHashMap.java:418)
at java.util.HashMap$Values.iterator(HashMap.java:1038)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:197)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
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:200)
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:200)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    .
    .

共有1个答案

顾池暝
2023-03-14

谢谢日出76,弄清楚了问题所在。所有EMF类都继承自EObject,EObject具有导致递归的某些字段:eAttributes,eContainer,eContent。使用排除策略忽略这些字段,即可设置。

 类似资料:
  • 问题内容: 我需要转换从REST API获得的JSON数据,并将其转换为CSV以便进行分析。问题在于JSON数据不一定遵循相同的内容,因此我无法定义映射类型。这已经成为一项挑战,占用了我太多时间。我已经创建了一些代码,但是由于它在此行上引发了异常,因此它当然不起作用 错误是: 附加信息:无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型’System.Collecti

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

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

  • 在“生产模式”(使用Vaadin 19.0.9和gradle)下生成“war”文件(大小为90 MB)后,Tomcat 9.0.52中的部署过程非常慢并显示此错误 这种错误经常发生,但并不总是如此。 tomcat服务器运行在Ubuntu 18上,内存为8gb。java版本为15.0.2(适用于此计算机和用于开发的计算机)。 知道吗?谢谢 PS:这是堆栈跟踪:

  • 我有一个类 Delete 我想使用 Gson 库将其转换为 json,但是当我转换它时,它会抛出 这是我的类 这里是枚举类DeleteStatus.scala 删除原因.scala 以下是我如何在Json转换 但它抛出以下异常 请帮助其中的错误

  • 问题内容: 我想使用rxjava Observable处理翻新中的分页。我听了另一个问题的建议。 我有100多个页面需要获取,但是链在第20页左右失败,并且在logcat中使用以下日志停止了对可观察对象的任何进一步订阅 有人知道为什么会发生这种情况吗? 更新: 我知道这是由于递归而发生的,但是有没有更优雅的方式来处理带有翻新和rxjava的分页? 问题答案: 因此,鉴于我回答了您引用的原始问题,我