我有这个类结构来序列化TreeGrid
(www.treegrid.com)对象:
DataGrid.java
@XmlRootElement(name = "Grid")
public class DataGrid implements Serializable {
private static final long serialVersionUID = 337286974296229101L;
@XmlElement(name = "Body")
public DataGridData data = new DataGridData();
@XmlElement(name = "IO")
public XmlAttributeHolder io = new XmlAttributeHolder();
public DataGrid() {
}
}
和
DataGridData.java
public class DataGridData {
@XmlElement(name="B")
public DataGridCurrentPage currentPage = new DataGridCurrentPage();
@XmlElement(name="B")
public List<XmlAttributeHolder> pageList = new ArrayList<XmlAttributeHolder>();
}
将处理这些类以返回XML结构,如下所示:
<Grid>
<Body>
<B />
</Body>
</Grid>
但是封装在B中的信息可能不同(因此在同一DataGridData
映射的XmlElement
类中存在两个属性。
如果我在Java 7下运行我的项目就可以了,但是在Java 8引发冲突异常的情况下,两个属性不能使用相同的XmlElement映射。
一种可能的解决方案是:在两个不同的类中封装两个属性,如下所示:
DataGridData.java
public class DataGridData {
private DataGridDataCP dataGridDataCP;
private DataGridDataPL dataGridDataPL;
public DataGridData() {
this.dataGridDataCP = new DataGridDataCP();
this.dataGridDataPL = new DataGridDataPL();
}
public DataGridDataCP getDataGridDataCP() {
return dataGridDataCP;
}
public void setDataGridDataCP(DataGridDataCP dataGridDataCP) {
this.dataGridDataCP = dataGridDataCP;
}
public DataGridDataPL getDataGridDataPL() {
return dataGridDataPL;
}
public void setDataGridDataPL(DataGridDataPL dataGridDataPL) {
this.dataGridDataPL = dataGridDataPL;
}
}
DataGridDataCP.java
public class DataGridDataCP {
private DataGridCurrentPage currentPage;
public DataGridDataCP() {
this.currentPage = new DataGridCurrentPage();
}
@XmlElement(name="B")
public DataGridCurrentPage getCurrentPage() {
return currentPage;
}
public void setCurrentPage(DataGridCurrentPage currentPage) {
this.currentPage = currentPage;
}
}
DataGridDataPL.java
public class DataGridDataPL {
private List<XmlAttributeHolder> pageList;
public DataGridDataPL() {
this.pageList = new ArrayList<XmlAttributeHolder>();
}
@XmlElement(name="B")
public List<XmlAttributeHolder> getPageList() {
return pageList;
}
public void setPageList(List<XmlAttributeHolder> pageList) {
this.pageList = pageList;
}
}
但是以这种方式序列化DataGridData
类时,添加标记<dataGridDataCP>
(或<dataGridDataPL>
),但我不想显示此中间标记。
我尝试使用XmlAccessorType
注释来排除对象DataGridDataCP
/ DataGridDataPL
,但此注释会排除整个对象(包含其封装属性,而不仅仅是{{1}中的属性} class)
答案 0 :(得分:0)
你可以尝试一些东西,但你只能正确序列化。反序列化将不起作用,我将解释原因。代码看起来像这样:
@XmlAccessorType(XmlAccessType.FIELD)
public class DataGridData {
@XmlElements({
@XmlElement(name = "B", type = DataGridCurrentPage.class),
@XmlElement(name = "B", type = XmlAttributeHolder.class),
})
List<Object> values;
}
现在,如果您创建POJO并序列化,您将获得所需的XML。如果这是你的需要那么你应该没事。
但是如果你还想要反序列化,因为这两个类都被映射到名为&#39; B&#39;的@XmlElement
。它将选择一个目标类进行反序列化(我相信最后指定的类)。