2017-03-02 125 views
1

我想使用snakeyaml将下面的YAML deserilise放入下面的域模型中,但是我一直在收到java.lang.ClassCastException:java.util.LinkedHashMap无法转换为ConfigurableThing。包含对象列表的SnakeYaml Deserialise类

注意我能够成功反序列化一个ConfigurableThing,它只有在试图反序列化我遇到问题的ConfigurableThings列表时。

守则deserialise

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 
} 

回答

2

你不显示代码哟你用来加载你的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接口的泛型参数。所以你需要告诉它构造列表项目为ConfigurableThing;如果你不这样做,将会构建一个HashMap。这是您在错误消息中看到的内容。

+0

完美,谢谢!对于后人,我添加了我使用的不正确的代码加载YAML。 –

+0

即使有人拒绝,编辑建议也是正确的。 'addTypeDescription'是正确的名称; SnakeYaml文档使用'addTypeDefinition'这是错误的。 – flyx

+0

它的工作原理,但只是增加了几行,这说明了最后一行发生了什么:File file = new File(“configuration.yaml”); InputStream in = new FileInputStream(file); Config list =(Config)yaml.load(in); –

相关问题