Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deserialize nested class using yamlbeans

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.

like image 203
Alex Pritchard Avatar asked Feb 27 '12 20:02

Alex Pritchard


1 Answers

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.

like image 162
Batman Avatar answered Nov 11 '22 23:11

Batman