使用yamlbeans和fxml属性进行yaml序列化

时间:2018-01-18 19:38:24

标签: java serialization properties yaml

我正在尝试使用YamlBeans来序列化fxml属性。具体是一个属性。该类具有私有属性字段和fxml标准getter和setter方法,但在序列化时信息不会保存到文件中。

切入点:

import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException{
        Person person = new Person(5);
        YamlSerializer.serialize(person, System.getProperty("user.dir") + "/person.yml");
    }
}

Person.java

import javafx.beans.property.Property;
import javafx.beans.property.SimpleDoubleProperty;

public class Person{
    private Property<Number> age;
    public Person(){
        age = new SimpleDoubleProperty();
        age.setValue(3);
    }
    public Person(Number age){
        this.age = new SimpleDoubleProperty(age.doubleValue());
    }
    public Property<Number> ageProperty() {
        return this.age;
    }

    public Number getAge() {
        return this.ageProperty().getValue();
    }

    public void setAge(final Number age) {
        this.ageProperty().setValue(age);
    }
}

YamlSerializer.java

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import com.esotericsoftware.yamlbeans.YamlReader;
import com.esotericsoftware.yamlbeans.YamlWriter;

public class YamlSerializer {
    public static void serialize(Object object, String path) throws IOException{
        File file = new File(path);
        if(!file.exists())
            file.getParentFile().mkdirs();
        YamlWriter writer = new YamlWriter(new FileWriter(path));
        writer.write(object);
        writer.close();
    }
    public static Object deserialize(String path) throws IOException{
        File file = new File(path);
        if(!file.exists()){
            if(!file.getParentFile().exists())
                if (!file.getParentFile().mkdirs()){
                    System.out.println("Error creating files");
                }
        }
        YamlReader reader = new YamlReader(new FileReader(path));

        return reader.read();
    }
}

输出文件person.yml:

!Person {}

enter image description here

1 个答案:

答案 0 :(得分:0)

您的代码看起来不错。 Beans getProperties为您的课程返回什么?这就是YamlWriter uses

结果Beans找到所有属性,然后查找get / set方法。看起来它应该找到您的number字段,然后是setNumbergetNumber方法,但您没有提供完整的类代码。

我建议提供SSCCE。试图帮助没有这个的人是黑暗中的一击,浪费时间。

编辑:Beans查找字段的方式,然后是匹配的setter / getter,Property<Number> age不起作用。 Beans寻找Property<Number>类型的setter / getter并且找不到它们。 IIRC曾经使用过Introspector,但由于Android中没有它,所以必须将其删掉。

要解决这个问题,你需要修补Beans,以便更聪明地找到没有相应字段的setter / getter。执行此操作的PR将合并。