java - SnakeYaml - 反序列化为字符串和自定义对象的映射时出现 ClassCastException

标签 java deserialization snakeyaml

我试图使用 SnakeYaml 在 Java 中创建字符串和对象的映射。

Person.java 类用于存储有关个人的信息。我想从 yaml 文件中读取有关每个人的信息并将其存储在 map 中,其中 人名作为Person 对象。 IE。对于每个人的名字,都必须创建一个人对象并将其添加到 map 中。

编辑: YAML 反序列化应该创建一个 Map<String, Person>

下面是每个文件的内容:

YAML 文件:

PersonName1: 
  value1: foo1
  value2: bar1
  value3: foobar1

PersonName2:
  value1: foo2
  value2: bar2
  value3: foobar2

Person.java

public class Person {
    public String value1;
    public String value2;
    public String value3;
}

主.java

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        InputStream inputStream = new FileInputStream(new File("SampleYamlFile.yml"));
        Yaml yaml = new Yaml();

        Map<String, Person> persons = (Map<String, Person>) yaml.load(inputStream);
        for(String key : persons.keySet()) {
            System.out.println("key = " + key);
            Person person = persons.get(key);
            System.out.println("person = " + person);
        }
    }
}

map 的创建没有任何错误。 key 也被打印出来。 但是当我尝试访问 key 的值时,我得到了一个 ClassCastException

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to Person

SnakeYaml 不支持这种类型的反序列化吗? 非常感谢任何有关为什么会出现此问题以及如何解决此问题的帮助。

最佳答案

改变这个:

Yaml yaml = new Yaml();

到:

Yaml yaml = new Yaml(new Constructor(Person.class));

这是一个如何使用 SnakeYaml 的好例子: https://aqaexplorer.com/2019/12/10/parsing-yaml-with-snake-yaml/

关于java - SnakeYaml - 反序列化为字符串和自定义对象的映射时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26450378/

相关文章:

一旦内容可用,Java 就会从 Stream 中读取

java - 如何检测Java中 "unsigned"长乘法的溢出?

java - Jettison 或 Kryo

c# - WebApi 响应反序列化为 List<string>

java - SnakeYaml "Unable to find property error"

java - 将 YAML 反序列化为 JAVA

java - pattern.dotall 在\Q 和\E 之间不起作用

c# - 如何反序列化(JSON)实现接口(interface) : error no parameterless constructor defined? 的类类型的对象

groovy - 如何将常规表示转储到 YAML 并避免出现未标记的节点?

java - 使用相同的附加程序记录多个记录器