使用snakeyaml库在Java中将对象序列化为YAML

使用snakeyaml库在Java中将对象序列化为YAML,java,serialization,snakeyaml,Java,Serialization,Snakeyaml,我没有太多的序列化经验。在尝试序列化下面类的一个简单对象时,我从YAML库中得到了这个找不到JavaBean属性异常 下面是课堂: public class MyClass { String value; public MyClass(String args) { value = args; } public String getValue(){ return value; } } 下面是我如何使用SnakeYAMAL序

我没有太多的序列化经验。在尝试序列化下面类的一个简单对象时,我从YAML库中得到了这个
找不到JavaBean属性异常

下面是课堂:

public class MyClass {
    String value;
    public MyClass(String args) {
        value = args;
    }

    public String getValue(){
        return value;
    }
}
下面是我如何使用SnakeYAMAL序列化的:

import java.util.HashMap;
import java.util.Map;

import org.yaml.snakeyaml.Yaml;


public class Test {

    public static void main(String[] args) {

        MyClass obj = new MyClass("this is my data");

        Map<String, Object> data = new HashMap<String, Object>();
        data.put("MyClass", obj);
        Yaml yaml = new Yaml();
        String output = yaml.dump(data);
        System.out.println(output);
    }

}
你能告诉我在做这件事的过程中我遗漏了什么,或者我应该如何正确地做

编辑:

public class MyClass {
    String value;
    public MyClass() {}

    public String setValue(String value){
        this.value = value;
    }

    public String getValue(){
        return value;
    }
}
如果我在序列化之前设置了这个值,它会以某种方式工作。
您认为这是合适的解决方案还是不推荐的方法?

SnakeYAML主要用于序列化JavaBeans

上面给出的示例不符合JavaBean规范。要成为JavaBean,对象必须有一个无参数构造函数,每个字段必须有一个getter和setter

如果您将类重写为bean,SnakeYAML应该毫无问题地序列化它。此外,SnakeYAML可以序列化公共字段,因此,如果您将
值的可见性更改为
公共
,则SnakeYAML将查找并序列化它

如果确实希望避免更改
MyClass
,可以显式地告诉SnakeYAML序列化只读属性,如下所示:

PropertyUtils propUtils = new PropertyUtils();
propUtils.setAllowReadOnlyProperties(true);
Representer repr = new Representer();
repr.setPropertyUtils(propUtils);
Yaml yaml = new Yaml(new Constructor(), repr);
但是,当您将非JavaBean对象反序列化回
对象时,将其转储到YAML可能会导致问题,因此我建议使用JavaBean作为最简单、最安全的解决方案

编辑:下面是一个MyClass转换为JavaBean的示例:

public class MyClass {
    String value;

    /* public, no-argument constructor */
    public MyClass() {
    }

    /* Every field has a public getter... */
    public String getValue(){
        return value;
    }

    /* ... and a public setter */
    public void setValue(String value) {
        this.value = value;
    }
}

您可以添加一个将这个类转换为JavaBean的小例子吗。我不知道如何使用JavaBeans,thanks@Johnydep我已经编辑了我的答案,以包含一个将
MyClass
转换为有效JavaBean的示例。您能否确认我编辑的代码是否是使用YAML序列化的正确方法?谢谢,有没有办法让SnakeYAML与Lombok项目自动生成的无参数构造函数、getter和setter一起工作?
public class MyClass {
    String value;

    /* public, no-argument constructor */
    public MyClass() {
    }

    /* Every field has a public getter... */
    public String getValue(){
        return value;
    }

    /* ... and a public setter */
    public void setValue(String value) {
        this.value = value;
    }
}