SnakeYAML 2.0 中的“不允许全局标记”异常

1 yaml snakeyaml

我正在使用 SnakeYAML 2.0 来解析 Java 中的 YAML 文件。但我在这里面临一个问题。这是我的User课:

package ir.sharif;

import java.util.ArrayList;
import java.util.List;

public class User {
    int id;
    String username;
    String password;
    List<User> friends = new ArrayList<>();

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public User() {
    }

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我使用以下代码来序列化User对象:

package ir.sharif;

import org.yaml.snakeyaml.Yaml;

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException {
        User user = new User();
        user.setId(10);
        user.setUsername("Jack");
        user.setPassword("jackSparrow2023");
        List<User> friends = new ArrayList<>();
        friends.add(new User(1, "Trent", "FCB"));
        friends.add(new User(2, "Jordan", "LFC"));
        user.setFriends(friends);

        Yaml yaml = new Yaml();
        yaml.dump(user, new FileWriter("src/main/resources/sample.yml"));
    }
}
Run Code Online (Sandbox Code Playgroud)

这是运行方法sample.yml后我的文件的样子:main

!!ir.sharif.User
friends:
- friends: []
  id: 1
  password: FCB
  username: Trent
- friends: []
  id: 2
  password: LFC
  username: Jordan
id: 10
password: jackSparrow2023
username: Jack
Run Code Online (Sandbox Code Playgroud)

现在我想反序列化此数据并将其加载为新User对象:

package ir.sharif;

import org.yaml.snakeyaml.Yaml;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Main {
    public static void main(String[] args) throws IOException {
        Yaml yaml = new Yaml();
        try (Reader reader = new FileReader("src/main/resources/sample.yml")) {
            User user = yaml.load(reader);
            System.out.println(user);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但运行后,我得到这个异常:

Exception in thread "main" Global tag is not allowed: tag:yaml.org,2002:ir.sharif.User
 in 'reader', line 1, column 1:
    !!ir.sharif.User
    ^
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

正如我搜索的那样,我做得没错,但我认为问题是由于 2.0 版本中发生了一些变化而引起的。我尝试像这样加载我的对象(我!!ir.sharif.User从 YAML 文件中删除了行):

Exception in thread "main" Global tag is not allowed: tag:yaml.org,2002:ir.sharif.User
 in 'reader', line 1, column 1:
    !!ir.sharif.User
    ^
Run Code Online (Sandbox Code Playgroud)

而且效果很好。但是如果我想反序列化SnakeYAML本身序列化的对象,我就不能使用这个方法了。我应该怎么办?我很感激任何帮助。

fly*_*lyx 5

您需要注册一个TagInspector允许您的标签的:

var loaderoptions = new LoaderOptions();
TagInspector taginspector = 
    tag -> tag.getClassName().equals(User.class.getName());
loaderoptions.setTagInspector(taginspector);
Yaml yaml = new Yaml(new Constructor(User.class, loaderoptions));
Run Code Online (Sandbox Code Playgroud)