JAXB:序列化私有字段并反序列化,而不使用无参数的构造函数

时间:2015-11-07 00:54:25

标签: serialization jaxb deserialization

我遇到的问题涉及一个非常复杂的类结构,但我设法在下面的简单例子中总结了它的要点。我需要能够序列化类 MyItem 的对象(包括私有属性' text'),然后在不使用无参数构造函数的情况下对其进行反序列化,并且无法创建一,因为它会完全弄乱当前的逻辑。

class MyCollection

@XmlRootElement(name="collection")
public class MyCollection {

    public MyCollection() {
        this.items = new ArrayList<MyItem>();
    }

    @XmlElement(name="item")
    private List<MyItem> items;

    public void addItem(String text) {
        this.items.add(new MyItem(text));
    }
}

MyItem

public class MyItem {

    public MyItem(String text) {
        this.text = text;
    }

    @XmlAttribute
    private String text;
}

第一个要求(序列化 MyItem 包括私有属性)开箱即用,我得到以下xml:

<collection>
    <item text="FIRST"/>
    <item text="SECOND"/>
    <item text="THIRD"/>
</collection>

为了满足第二个要求,我使用属性 @XmlJavaTypeAdapter

来修饰类 MyItem
@XmlJavaTypeAdapter(MyItemAdapter.class)
public class MyItem {
  ...

并引入了类 AdaptedMyItem

public class AdaptedMyItem {

    private String text;
    public void setText(String text) { this.text = text; }
    @XmlAttribute
    public String getText() { return this.text; }
}

MyItemAdapter

public class MyItemAdapter extends XmlAdapter<AdaptedMyItem, MyItem> {

    @Override
    public MyItem unmarshal(AdaptedMyItem adaptedMyItem) throws Exception {
        return new MyItem(adaptedMyItem.getText());
    }

    @Override
    public AdaptedMyItem marshal(MyItem item) throws Exception {
        AdaptedMyItem result = new AdaptedMyItem();
        result.setText("???"); // CANNOT USE item.getText()
        return result;
    }
}

但是这就是我被卡住的地方,因为在方法 marshal 我无法访问 MyItem.text ,所以我不能使用标准方法来处理JAXB中的不可变类。

底线:我想仅在反序列化时使用类适配器机制(因为我需要调用非参数构造函数),而不是在序列化时使用(因为我无法访问私有属性)。那可能吗?

0 个答案:

没有答案