Springboot底层-snakeyaml自定义转储格式

YAML文档自定义转储

在SnakeYAML中进行转储的主要目的是生成可以反序列化实例的YAML文档。在某些情况下,创建的YAML文档可能并不符合你的需求:

  • 不可变的对象。不可变对象可能拥有getter方法,但不存在setter方法。默认情况下,映射时会调用setter方法或构造方法。若属性的顺序不一致,致使对象无法解析。因此对象属性的顺序尤为重要,必须按照指定顺序序列化属性。
  • 注释。注释可以帮助我们更好的理解和编辑YAML文档。
  • 跳过一些JavaBean属性(例如:空集合、null、计算属性等)。
  • 定义JavaBean属性顺序。这个顺序可能非常有用:比如,我们通常会将id或name作为第一个属性。(默认情况下按照字母顺序排序。)
  • 由于标准类型具有一个以上的值,因此可以将Representer配置为使用不同的值。

YAML文档就是一个普通的文本文档,因此你可以使用任意的模板处理器来处理它。

默认算法:

  1. 判断是否可以仅使用DumperOptions
  2. 若不是则使用yaml.dumpAs(obj,Tag.MAP)来解析它。
  3. 选择您指定的模板引擎,然后继续解析。
  4. 自行编写一个对象类存储数据,然后通过YAML解析生成对象类实例进行测试。测试过程中会提示该对象类不符合规范的地方并提醒您修改。
  5. 您也可以考虑扩展SnakeYAML的org.yaml.snakeyaml.representer.Representer
  6. 实现你自己的模板引擎,将实例序列化为YAML文档。

以下是使用模板的示例。

JavaBeans

这个规范说明:“JavaBeans体系结构的主要目的是提供一种平台无关的组件体系结构。”

避免使用全局标记可以提高不同平台和语言之间公用YAML文档的能力。简单点来说就是跨平台和跨语言的能力。

若您自定义的Java类符合JavaBean规范,则可无需其他额外的代码支持,就可实现对象的序列化与反序列化。

例如:

public class CarWithWheel {
    private String plate;
    private String year;
    private Wheel wheel;
    private Object part;
    private Map<String, Integer> map;

    public String getPlate() {
        return plate;
    }

    public void setPlate(String plate) {
        this.plate = plate;
    }

    public Wheel getWheel() {
        return wheel;
    }

    public void setWheel(Wheel wheel) {
        this.wheel = wheel;
    }

    public Map<String, Integer> getMap() {
        return map;
    }

    public void setMap(Map<String, Integer> map) {
        this.map = map;
    }

    public Object getPart() {
        return part;
    }

    public void setPart(Object part) {
        this.part = part;
    }

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }
}
CarWithWheel car1 = new CarWithWheel();
car1.setPlate("12-XP-F4");
Wheel wheel = new Wheel();
wheel.setId(2);
car1.setWheel(wheel);
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("id", 3);
car1.setMap(map);
car1.setPart(new Wheel(4));
car1.setYear("2008");
String output = new Yaml().dump(car1);

以上代码会输出如下文档:

!!package.CarWithWheel
map: {id: 3}
part: !!org.yaml.snakeyaml.constructor.Wheel {id: 4}
plate: 12-XP-F4
wheel: {id: 2}
year: '2008'

注意: ‘part’属性存在全局标记。而‘wheel’则没有(因为wheel的运行时类与CarWithWheel类中定义的相同)。

转储时首选的方法是使用yaml.dumpAs(obj,Tag.MAP)


Springboot底层-snakeyaml自定义转储格式
https://blog.cikaros.top/doc/ef82d306.html
作者
Cikaros
发布于
2021年4月15日
许可协议