JAXB 编组属性

JAXB marshall Properties

使用 JAXB,我不知道如何编组 Properties。特别是,我正在尝试编组 SimpleObjectProperty 但我认为它也不适用于其他属性。在其他一些 类 中,我能够管理 getters/setters,但在 SimpleObjectProperties

HashMap 这种情况下,这将不起作用

这是我的代码片段:

..
@XmlRootElement(name = "derby")
@XmlAccessorType(XmlAccessType.FIELD)
public class Derby extends Observable {
    @XmlElement(name = "cars")
    private final ArrayList<Car>                                cars;
    @XmlTransient
    private final ObservableList<Car>                           carsObservable;
    @XmlElement(name = "schedule")
    private final SimpleObjectProperty<Schedule>                scheduleProperty;
    @XmlElement(name = "settings")
    private final HashMap<String, SimpleObjectProperty>         settings;//This is not marshalling correctly
..

这里是输出 XML 片段:

...
<settings>
    <entry>
        <key>track.lanecount</key>
        <value/> //No value???
    </entry>
    <entry>
        <key>general.cardisplay</key>
        <value/>
    </entry>
    <entry>
        <key>track.orientation</key>
        <value/>
    </entry>
    <entry>
        <key>general.derbytitle</key>
        <value/>
    </entry>
</settings>
...

我正在创建变量而不是让它们处于未初始化状态。我还测试了这些设置在编组之前是否真的有值,它们确实有。

我使用 Properties 而不是我试图存储的真实对象的原因是因为我想将侦听器添加到我的设置中,所以当单个设置更改时,所有依赖于它会自动更新。

我看到你正在使用 @XmlAccessorType(XmlAccessType.FIELD) 这意味着 class 字段用于编组/解组值...

您可以将其更改为 @XmlAccessorType(XmlAccessType.PROPERTY) 然后将所有 @XmlElement 放到 getter 的 属性.

有关更多信息,请参阅文档:XmlAccessType

你的代码看起来像这样:

..
@XmlRootElement(name = "derby")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Derby extends Observable {

    private final ArrayList<Car>                                cars;

    private final ObservableList<Car>                           carsObservable;

    private final SimpleObjectProperty<Schedule>                scheduleProperty;

    private final HashMap<String, SimpleObjectProperty>         settings;//This is not marshalling correctly

    @XmlElement(name = "cars")
    public List<Car> getCars() {
        return cars;
    }

    public void setCars(final ArrayList<Car> cars) {
        this.cars.clear();
        this.cars.addAll(cars);
    }

    @XmlElement(name = "schedule")
    public Schedule getSchedule() {
        return this.scheduleProperty.get();
    }

    public void setSchedule(final Schedule schedule) {
        this.scheduleProperty.set();
    }

    @XmlElement(name = "settings")
    public Map<String, Object> getSettings() {
        // do your mapping logic here...
        // convert your HashMap<String, SimpleObjectProperty> to Map<String, Object>
    }

    public void setSettings(final Map<String, Object> settings) {
        // do your mapping logic here...
        // convert your Map<String, Object> to HashMap<String, SimpleObjectProperty>
    }

    @XmlTransient
    public ObservableList<Car> getCarsObservable() {
        return carsObservable;
    }
..