java - 由于使用了 Observable List,Gson 无法反序列化
问题描述
我想使用 Gson 导入和导出在我的软件中创建的角色,虽然导出工作正常,但导入失败并显示
java.lang.IllegalArgumentException: Can not set javafx.collections.ObservableList field items.GameCharacter.weapons to java.util.ArrayList
我阅读了 gson 文档,它说通过令牌类型解决这个问题,但我不知道我应该如何做到这一点,因为 Gson 无法反序列化的属性是不同类型的:完整的对象是 GameCharacter 类型,带有一些整数和字符串,但我也使用:
private ObservableList<Weapon> weapons;
private BattleRound battleRound;
private ObservableList<Spell> spells;
private Armor armor;
当 gson 只接受一个 TypeToken 时,我如何准确地告诉 gson 所有这些不同的类型?任何帮助将不胜感激:)顺便说一句我用于导入的代码:
public class Import {
private Gson gson = new GsonBuilder().setPrettyPrinting().create();
public GameCharacter importCharacter(String url) {
try (Reader reader = Files.newBufferedReader(Paths.get(url), Charset.defaultCharset())) {
return gson.fromJson(reader, new TypeToken<GameCharacter>(){}.getType());
} catch (IOException e) {
}
throw new NullPointerException("No character was able to load");
}
}
解决方案
类型令牌有助于处理类型擦除问题,其中通用信息在运行时丢失(在运行时List<String>
变为List
,因此它不知道列表中的内容)。
您的问题看起来像您正在尝试反序列化为 ObservableList ,这可能不是默认情况下与 gson 兼容的类型。您可以按照文档实现自己的自定义反序列化器,或者您可以序列化/反序列化为更简单的对象,该对象使用更受支持的核心类型,例如 List 并复制到您的内部对象。
通常,像 Observable List 这样的对象不是序列化使用的好目标,因为它们需要额外的工作来在重新加载时重新初始化。
推荐阅读
- python - 从 Pandas Dataframe 中的滚动时间窗口中识别重复项
- java - 使用方法调用打印出过滤后的二维数组时遇到问题
- node.js - Feathers js - 类型错误:app.get 不是函数
- java - 如何使用 keycloak 保护 angular/spring 应用程序?
- image-processing - 关于相机中渐晕的一些问题
- angular - 嵌套组件上的动画未触发
- r - 我需要在 R 中将奇怪的日期格式从字符转换为日期格式
- git - Git pull 不会在无限 for 循环中影响本地文件?
- jupyter-notebook - 如何从 Jupyter notebook 创建的 Reveal.js 幻灯片中删除过渡?
- android - 当您的 android 应用程序中有 300 多个首选项时,从共享首选项迁移到 Jetpack Proto 数据存储?