gpt4 book ai didi

yaml - SnakeYaml 反序列化包含对象列表的类

转载 作者:行者123 更新时间:2023-12-02 15:12:51 31 4
gpt4 key购买 nike

我正在尝试使用 snakeyaml 将下面的 YAML 反序列化到下面的域模型中,但是我不断收到 java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to ConfigurableThing。

请注意,我能够成功反序列化单个 ConfigurableThing,只有在尝试反序列化我遇到问题的 ConfigurableThing 列表时。

反序列化代码

File file = new File(classLoader.getResource("config.yml").getFile());

try(InputStream in = new FileInputStream(file)){
Yaml yaml = new Yaml();
Configuration config = yaml.loadAs(in,Configuration.class);
}

YAML

things:
- type: TYPE1
name: foo
value: 2.00
- type: TYPE2
name: bar
value 8.00

型号

public final class Config {

private List<ConfigurableThing> things;

//Getter and Setter

}

public final class ConfigurableThing {

private Type type;

private String name;

private BigDecimal value;

//Getters and Setters
}

public enum Type {
TYPE1,TYPE2
}

最佳答案

您没有显示用于加载 YAML 的代码,但您的问题可能是您没有正确注册集合类型。试试这个:

Constructor constructor = new Constructor(Config.class);
TypeDescription configDesc = new TypeDescription(Config.class);
configDesc.putListPropertyType("things", ConfigurableThing.class);
constructor.addTypeDescription(configDesc);
Yaml yaml = new Yaml(constructor);
Config config = (Config) yaml.load(/* ... */);

你需要这样做的原因是类型删除——SnakeYaml 无法在运行时确定 List 接口(interface)的泛型参数。所以你需要告诉它把列表项构造为 ConfigurableThing;如果不这样做,将构造一个 HashMap。这就是您在错误消息中看到的内容。

关于yaml - SnakeYaml 反序列化包含对象列表的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42545091/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com