好一段时间没写博客了,一直出差得有半年多时间了吧!其实还是懒,哈哈
最近算是转行做大数据了,还好有个前辈带带,应该是比不少人少走弯路吧!
这东西主要学的是思想
今天写个java对象和xml互转的(项目的要用到xml的配置文件)
主要是用JAXB实现java对象与xml直接的互相转换,先列举一下JAXB(Java Architecture for XML Binding)的注解
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。
@XmlRootElement,用于类级别的注解,对应xml的跟元素。通过
name
属性定义这个根节点的名称。@XmlAccessorType,定义映射这个类中的何种类型都需要映射到xml。(如果不存在@XmlAccessorType,默认使用
XmlAccessType.PUBLIC_MEMBER
注解)参数:
XmlAccessType.FIELD
: java对象中的所有成员变量。XmlAccessType.PROPERTY
:java对象中所有通过getter/setter方式访问的成员变量。XmlAccessType.PUBLIC_MEMBER
:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量。XmlAccessType.NONE
: java对象的所有属性都不映射为xml的元素。@XmlAttribute,用于把java对象的属性映射为xml的属性,并可通过
name
属性为生成的xml属性指定别名。@XmlElement,指定一个字段或get/set方法映射到xml的节点。通过
name
属性定义这个根节点的名称。@XmlElementWrapper,为数组或集合定义一个父节点。通过
name
属性定义这个父节点的名称。- @XmlTransient,用于标示在由java对象映射xml时,忽略此属性,在生成的xml文件中不出现此元素。
使用举例
/**
* 读入projectMeta.xml配置文件到对象中
*
* @param xmlPath
* xml的文件路径
* @return MetaDataHelper对象
* @throws JAXBException
* 异常
*/
public MetaDataHelper loadXmlObject(String xmlPath) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(MetaDataHelper.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
MetaDataHelper object = (MetaDataHelper) unmarshaller.unmarshal(new File(xmlPath));
return object;
}
/**
* 将java对象写成xml文件数据
*
* @param metaData
* java对象
* @return xml字符串
* @throws JAXBException
* 异常
*/
public String MeteData2Xml(MetaDataHelper metaData) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(MetaDataHelper.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
StringWriter writer = new StringWriter();
marshaller.marshal(metaData, writer);
return writer.toString();
}
其中MetaDataHelper 类中有定义根元素和其他相关元素,如下
@XmlRootElement(name = "project")
public class MetaDataHelper {
private Map<String, ItemMetaData> itemMetaDatas = null;
private ModelInfoMetaData modelMetaData = null;
private SceneMetaData sceneMetaData = null;
/**
* 指标元数据定义
*
* @return 返回全部item的元数据定义信息
*/
@XmlElementWrapper(name = "dataDescription")
public Map<String, ItemMetaData> getItemMetaDatas() {
return itemMetaDatas;
}
public void setItemMetaDatas(Map<String, ItemMetaData> itemMetaDatas) {
this.itemMetaDatas = itemMetaDatas;
}
/**
* 获取模型元数据定义
*
* @return 返回ModelMetaData对象
*/
@XmlElement(name = "model")
public ModelInfoMetaData getModelMetaData() {
return modelMetaData;
}
public void setModelMetaData(ModelInfoMetaData modelMetaData) {
this.modelMetaData = modelMetaData;
}
@XmlElement(name = "scene")
public SceneMetaData getSceneMetaData() {
return sceneMetaData;
}
public void setSceneMetaData(SceneMetaData sceneMetaData) {
this.sceneMetaData = sceneMetaData;
}
}
最后写一个测试类会生成相应的xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<project>
<dataDescription>
<entry>
<key>PBR4</key>
<value frequency="0" itemKey="PBR4" isMain="false" type="numbericItemClass">
<action>ArimaClass</action>
<rowIndex>24</rowIndex>
<rowIndexNew>4</rowIndexNew>
</value>
</entry>
<entry>
<key>MR</key>
<value frequency="1" itemKey="MR" isMain="false" type="numbericItemClass">
<action>ArimaClass</action>
<cluster>KeyModeClass</cluster>
<rowIndex>22</rowIndex>
<rowIndexNew>2</rowIndexNew>
</value>
</entry>
<entry>
<key>TCPfailure</key>
<value frequency="0" itemKey="UCTA" isMain="true" type="booleanItemClass">
<action>ArimaClass</action>
<rowIndex>25</rowIndex>
<rowIndexNew>5</rowIndexNew>
</value>
</entry>
<entry>
<key>UCTA</key>
<value frequency="1" itemKey="UCTA" isMain="true" type="booleanItemClass">
<action>ArimaClass</action>
<rowIndex>23</rowIndex>
<rowIndexNew>3</rowIndexNew>
</value>
</entry>
</dataDescription>
<model author="junwei" createTime="2018-03-26T01:39:52.578+08:00" id="jwDemo-10296">
<description>this model is created, trained and used for AIdemo purpose, this description is for specification</description>
<objectModel>
<action>logisticRegression</action>
<inputsTable>
<property>stability</property>
<property>capability</property>
</inputsTable>
</objectModel>
<properties>
<entry>
<key>capability</key>
<value key="capability">
<action mainKayAsInput="true" name="CNNClass" type="forecastClass"/>
<mainItem>PBR4</mainItem>
<refItems>
<item>MR</item>
<item>PBR4</item>
</refItems>
</value>
</entry>
<entry>
<key>MR</key>
<value key="MR"/>
</entry>
<entry>
<key>stability</key>
<value key="stability">
<action mainKayAsInput="false" name="bayesClass" type="forecast"/>
<refItems>
<item>MR</item>
<item>UCTA</item>
</refItems>
</value>
</entry>
</properties>
</model>
<scene class="cellObjectClass">
<src>t_cell_info</src>
</scene>
</project>