gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:35:29 31 4
gpt4 key购买 nike

我对序列化没有太多经验。在尝试序列化下面类的一个简单对象时,我从 YAML 库中得到了这个 No JavaBean properties found exception

这是类:

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);
}

}

执行时抛出异常:

Exception in thread "main" org.yaml.snakeyaml.error.YAMLException: No JavaBean properties found in MyClass
at org.yaml.snakeyaml.introspector.PropertyUtils.getProperties(PropertyUtils.java:112) ...

你能告诉我在做这件事时我遗漏了什么,或者我应该如何正确地做这件事吗?

编辑:

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 可以序列化公共(public)字段,因此如果您将 value 的可见性更改为 public,那么 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 可能会在您将它们反序列化回 Object 时导致问题,因此我建议使用 JavaBeans 作为最简单和最安全的解决方案。

编辑:这是一个将 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;
}
}

关于java - 使用 snakeyaml 库在 Java 中将对象序列化为 YAML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8488462/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com