I'm using yamlbeans to deserialize yaml files into Java objects. This works fine as long as I only have one class. The problem is when I want to nest a field, I am forced to specify the nested class in the yaml description.
Single class example:
Java:
public class MessageField {
public String name;
public String type;
public int length;
public String comment;
}
yaml:
name: field1
type: int
length: 4
comment: first field
---
name: field2
type: string
length: 16
comment: second field
---
Multiple classes (requires !com.mylib.VariableField in yaml file)
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;
}
yaml:
name: field3
type: short
length: 2
comment:
variableFields:
- !com.mylib.VariableField
id: 1
name: nestedField 1
type: string
length: -1
comment:
---
The yaml documentation page describes how to deserialize a class by specifying the type when reading the class, which is what I do for my top level class:
YamlReader reader = new YamlReader(new FileReader("sample.yml"));
MessageField mf = reader.read(MessageField.class);
This correctly parses my fields for the top level class, but does not allow me to avoid the !com.mylib.VariableField identifier for my nested class. I'm trying to figure out if there is any way to change the Java code so that the yaml files are not required to know the class name.
I believe what you are looking for is
reader.getConfig().setPropertyElementType(MessageField.class, "variableFields", VariableField.class);
which sets the default element type for collection-based fields. Similarly, the setPropertyDefaultType
method can be used to specify the default type of a field itself.
With default field/element types specified for a YamlReader, you should no longer need to include class names in the yaml file (though any type names which you do include will override these defaults). Also, if default types are defined for a YamlWriter, superfluous class names will not be written to the yaml file.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With