Десериализовать вложенный класс с помощью yamlbeans - PullRequest
5 голосов
/ 28 февраля 2012

Я использую yamlbeans для десериализации файлов yaml в объекты Java. Это прекрасно работает, пока у меня только один класс. Проблема в том, что когда я хочу вложить поле, я вынужден указать вложенный класс в описании yaml.

Пример одного класса:

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
---

Несколько классов (требуется! Com.mylib.VariableField в файле yaml)

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:
---

Страница документации yaml описывает, как десериализовать класс, указав тип при чтении класса, что я и делаю для своего класса верхнего уровня:

YamlReader reader = new YamlReader(new FileReader("sample.yml"));
MessageField mf = reader.read(MessageField.class);

Это правильно анализирует мои поля для класса верхнего уровня, но не позволяет мне избежать идентификатора! Com.mylib.VariableField для моего вложенного класса. Я пытаюсь выяснить, есть ли способ изменить код Java, чтобы в файлах yaml не требовалось знать имя класса.

1 Ответ

8 голосов
/ 12 марта 2012

Я полагаю, что вы ищете

reader.getConfig().setPropertyElementType(MessageField.class, "variableFields", VariableField.class);

, который устанавливает тип элемента по умолчанию для полей на основе коллекции.Точно так же метод setPropertyDefaultType можно использовать для указания типа поля по умолчанию.

С типами полей / элементов по умолчанию, указанными для YamlReader, вам больше не нужно включать имена классов в файл yaml.(хотя любые имена типов, которые вы включаете, переопределяют эти значения по умолчанию).Кроме того, если для YamlWriter определены типы по умолчанию, лишние имена классов не будут записываться в файл yaml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...