java - 由于使用了 Observable List,Gson 无法反序列化

标签 java gson deserialization observablelist

我想使用 Gson 导入并导出在我的软件中创建的角色,虽然导出工作正常,但导入失败并显示

java.lang.IllegalArgumentException: Can not set javafx.collections.ObservableList field items.GameCharacter.weapons to java.util.ArrayList

我阅读了 gson 文档,它说可以通过 token 类型解决此问题,但我不知道应该如何执行此操作,因为 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 兼容的类型。您可以按照 docs 实现您自己的自定义解串器或者您可以序列化/反序列化为更简单的对象,该对象使用核心更好支持的类型(例如列表)并复制到内部对象。

通常像 Observable List 这样的对象并不是序列化使用的良好目标,因为它们需要额外的工作来在重新加载时重新初始化。

关于java - 由于使用了 Observable List,Gson 无法反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62942442/

相关文章:

java - Gson - 使用 InstanceCreator 即时设置对象引用

使用 Kotlin 进行 Gson 反序列化,未调用初始化程序 block

java - 如果java对象中不存在属性(应忽略json元素),如何使用Jackson将Json反序列化为java对象?

php如何以字符串形式表示多级数组

Python 反序列化 ViewState

java - 从 Eclipse 启动 JBoss 7.1.1 失败

c# - 接口(interface)会在子类中自动实现吗?

java - 修改两个不同函数的 JSON 输出

java - EJB3 的异常(exception)情况

java - 如何用LinkedHashMap获取子图?