包含对象列表的SnakeYaml Deserialise类

时间:2017-03-02 01:08:44

标签: yaml snakeyaml

我正在尝试使用snakeyaml将下面的YAML deserilise到下面的域模型中,但是我一直得到java.lang.ClassCastException:java.util.LinkedHashMap不能转换为ConfigurableThing。

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

要反序列化的代码

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
}

1 个答案:

答案 0 :(得分:4)

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

SelectList

您需要执行此操作的原因是类型擦除 - SnakeYaml无法在运行时确定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(/* ... */); 接口的泛型参数。所以你需要告诉它将列表项构造为List;如果不这样做,将构建ConfigurableThing。这是您在错误消息中看到的内容。