使用snakeyaml库在Java中将对象序列化为YAML
我没有太多的序列化经验。在尝试序列化下面类的一个简单对象时,我从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序
找不到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;
}
}