【问题标题】:Gson fails to deserialize because of Usage of Observable List由于使用了 Observable List,Gson 无法反序列化
【发布时间】:2020-07-16 19:48:12
【问题描述】:

我想使用 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");
    }
}

【问题讨论】:

    标签: java gson deserialization observablelist


    【解决方案1】:

    类型令牌有助于处理类型擦除问题,即通用信息在运行时丢失(List&lt;String&gt; 在运行时变为 List,因此它不知道列表中的内容)。

    您的问题看起来像是在尝试反序列化为 ObservableList,这可能不是默认情况下与 gson 兼容的类型。您可以在docs 之后实现自己的自定义反序列化器,或者您可以序列化/反序列化为使用核心更好支持的类型(例如 List)的更简单的对象,然后复制到您的内部对象。

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

    【讨论】:

    • 所以以防万一有人遇到类似的问题并且像我一样缺乏经验:我用一个模仿我真实 GameCharacter 类的类解决了这个问题,但将 ObservableLists 更改为普通的 Arraylists 以进行导出并返回一个带有自己的导入值的 GameCharacter。感谢@Deadron 的帮助
    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多