我们的XSD包含使用默认值的位置类型。因此,生成的代码将使用Double
包装器对象而不是原始double
。遗憾的是,我们无法修改架构以保持API稳定。
现在我们想要实例化该类型的大量(> 10M)对象。但这会占用相对大量的RAM。因此,我们正在寻找一种使用原始double
来避免包装器对象的方法。
我们的XSD部分:
<complexType name="Location">
<attribute name="x" type="double" default="NaN"/>
<attribute name="y" type="double" default="NaN"/>
</complexType>
<element name="Location" type="location:Location" />
生成的代码:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Location")
public class Location {
@XmlAttribute(name = "x")
protected Double x;
@XmlAttribute(name = "y")
protected Double y;
public double getX() {
if (x == null) {
return java.lang.Double.NaN;
} else {
return x;
}
}
public void setX(Double value) {
this.x = value;
}
public double getY() {
if (y == null) {
return java.lang.Double.NaN;
} else {
return y;
}
}
public void setY(Double value) {
this.y = value;
}
}
我们尝试扩展Location类,将它放在同一个包中但是在main而不是生成的源目录中:
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
@XmlType(name = "Location")
public class InternalLocation extends Location {
@XmlAttribute(name = "x")
private double x;
@XmlAttribute(name = "y")
private double y;
public InternalLocation() {
}
public InternalLocation(double x, double y) {
this.x = x;
this.y = y;
}
@Override
public double getX() {
return x;
}
@Override
public double getY() {
return y;
}
@Override
public void setX(Double x) {
// TODO null => NaN
this.x = x;
}
@Override
public void setY(Double y) {
// TODO null => NaN
this.y = y;
}
}
但结果XML不包含x和y值:
<ns2:Location xmlns:ns2="http://test.com/location" x="1.0" y="2.0"/>
VS
<ns2:Location xmlns:ns2="http://test.com/location"/>
使用Marshaller
JAXBContext.newInstance("com.test.location");
我们可以做些什么来使用InternalLocation
?
JAXBContext
com.test.location.Location$JaxbAccessorF_x
?还是有其他方法可以避免包装器对象吗?
我应该提到一件重要的事情:我们希望在CXF Web服务中使用它,但CXF也在使用JAXB。
PS:我们不希望使用不同的数据表示来进行内部和外部使用。
PPS:我们只需要propper序列化(在服务器端)。我们不需要反序列化到InternalLocation(在客户端)。