我遇到的问题涉及一个非常复杂的类结构,但我设法在下面的简单例子中总结了它的要点。我需要能够序列化类 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中的不可变类。
底线:我想仅在反序列化时使用类适配器机制(因为我需要调用非参数构造函数),而不是在序列化时使用(因为我无法访问私有属性)。那可能吗?