SnakeYaml 反序列化 Class 包含对象列表
SnakeYaml Deserialise Class containing a List of Objects
我正在尝试使用 snakeyaml 将下面的 YAML 反序列化到下面的域模型中,但是我一直收到 java.lang.ClassCastException:java.util.LinkedHashMap 无法转换为 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
接口的泛型参数。所以你需要告诉它把列表项构造为 ConfigurableThing
;如果你不这样做,一个 HashMap
将被构建。这就是您在错误消息中看到的内容。
我正在尝试使用 snakeyaml 将下面的 YAML 反序列化到下面的域模型中,但是我一直收到 java.lang.ClassCastException:java.util.LinkedHashMap 无法转换为 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
接口的泛型参数。所以你需要告诉它把列表项构造为 ConfigurableThing
;如果你不这样做,一个 HashMap
将被构建。这就是您在错误消息中看到的内容。