使用yamlbeans反序列化嵌套类

Ale*_*ard 6 java configuration serialization yaml

我正在使用yamlbeans将yaml文件反序列化为Java对象.只要我只有一个类,这个工作正常.问题是当我想嵌套一个字段时,我被迫在yaml描述中指定嵌套类.

单类示例:

Java的:

public class MessageField {
    public String name;
    public String type;
    public int length;
    public String comment;
}
Run Code Online (Sandbox Code Playgroud)

YAML:

name: field1
type: int
length: 4
comment: first field
---
name: field2
type: string
length: 16
comment: second field
---
Run Code Online (Sandbox Code Playgroud)

多个类(需要在yaml文件中使用!com.mylib.VariableField)

Java的:

public class MessageField {
    public String name;
    public String type;
    public int length;
    public String comment;
    public List<VariableField> variableFields;
}
public class VariableField extends MessageField{
    public int id;
}
Run Code Online (Sandbox Code Playgroud)

YAML:

name: field3
type: short
length: 2
comment:
variableFields:
  - !com.mylib.VariableField
    id: 1
    name: nestedField 1
    type: string
    length: -1
    comment:
---
Run Code Online (Sandbox Code Playgroud)

yaml文档页面描述了如何通过在读取类时指定类型来反序列化类,这就是我为顶级类所做的事情:

YamlReader reader = new YamlReader(new FileReader("sample.yml"));
MessageField mf = reader.read(MessageField.class);
Run Code Online (Sandbox Code Playgroud)

这正确地解析了顶级类的字段,但是不允许我为我的嵌套类避免使用!com.mylib.VariableField标识符.我试图弄清楚是否有任何方法可以更改Java代码,以便yaml文件不需要知道类名.

小智 9

我相信你在寻找的是

reader.getConfig().setPropertyElementType(MessageField.class, "variableFields", VariableField.class);
Run Code Online (Sandbox Code Playgroud)

它为基于集合的字段设置默认元素类型.类似地,该setPropertyDefaultType方法可用于指定字段本身的默认类型.

使用为YamlReader指定的默认字段/元素类型,您不再需要在yaml文件中包含类名(尽管您包含的任何类型名称都将覆盖这些默认值).此外,如果为YamlWriter定义了默认类型,则不会将多余的类名写入yaml文件.