話不多說,直接上代碼
首先下載jar包
<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.11.1</version>
</dependency>
---------------------------------------------------
public class XStreamUtil {
private static XStream xStream = null;
/**
* 通過靜態內部類實現單例模式
*/
private static class LazyHolder {
private static final XStreamUtil INSTANCE = new XStreamUtil();
}
static{
if(xStream == null){
xStream = new XStream(new XppDriver(new NoNameCoder()));
xStream.aliasSystemAttribute(null,"class");//去掉class屬性
xStream.autodetectAnnotations(true);//自動探測註解
xStream.ignoreUnknownElements();//忽略未知元素
XStream.setupDefaultSecurity(xStream); //避免出現以下警告:Security framework of XStream not initialized, XStream is probably vulnerable
//下面2行代碼 解決com.thoughtworks.xstream.security.ForbiddenClassException 錯誤
//xStream.allowTypesByWildcard(new String[] {"com.qjw.boot.**"}); //掃描路徑
Class<?>[] classes = new Class[] { User.class, Tvo2.class }; //
xStream.allowTypes(classes);//指定對象
//使用註釋的必須要使用 processAnnotations
xStream.processAnnotations(classes);
}
}
private XStreamUtil(){}
/**
* 取得XStreamUtil實例
* @return
*/
public static final XStreamUtil getInstance(){
return LazyHolder.INSTANCE;
}
/**
* 取得XStream
* @return
*/
public static XStream getXStream(){
return xStream;
}
/**
* 與XStream.setupDefaultSecurity使用,爲顯式類型添加安全權限,避免拋出Security framework of XStream not initialized,
XStream is probably vulnerable異常信息
* @param classes
*/
public void setXStreamAllowTypes(Class[] classes){
xStream.allowTypes(classes);
}
/**
* 若使用註解,在XML字符串映射爲Java實體對象時,則一定要調用此方法.
* @param types
*/
public void setXStremProcessAnnotations(Class[] types){
xStream.processAnnotations(types);
}
/**
* 把實體對象轉換爲XML字符串
* @param pojo
* @return
*/
public String pojoToXml(Object pojo){
if(null == pojo){
return "";
}
try{
String top = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n";
String xmlStr = top+xStream.toXML(pojo);
System.out.println("生成的xml字符串如下:"+xmlStr);
return xmlStr;
}catch(Exception e){
e.printStackTrace();
}
return "";
}
/**
* 把實體對象轉換爲XML字符串並保存至指定文件中
* @param obj
* @param file
*/
public void pojoToXmlFile(Object obj,File file){
try{
String xmlStr = pojoToXml(obj);
pojoToXmlFile(xmlStr,file);
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 使用同步類 Transformer,將 xml 字符串保存到文件中
* @param xml
* @param file
* @throws Exception
*/
private void pojoToXmlFile(String xml,File file) throws Exception{
Transformer transformer = TransformerFactory.newInstance().newTransformer();
// 將字符串xml轉爲Source對象
InputSource is = new InputSource(new ByteArrayInputStream(xml.getBytes()));
Source xmlSource = new SAXSource(is);
// 同步操作
transformer.transform(xmlSource, new StreamResult(file));
}
/**
* 從XML字符串反序列化一個對象
* @param xmlStr
* @return
*/
public <T> T xmlToPojo(String xmlStr,Class<T> cls){
if(null == xmlStr || xmlStr.length() == 0){
return null;
}
try{
T object = (T) xStream.fromXML(xmlStr);
return object;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 從XML Reader反序列化一個對象
* @param reader
* @return
*/
public <T> T xmlToPojo(Reader reader,Class<T> cls){
if(null == reader ){
return null;
}
try{
T object = (T) xStream.fromXML(reader);
return object;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 從一個XML InputStream.中反序列化一個對象
* @param input
* @return
*/
public <T> T xmlToPojo(InputStream input,Class<T> cls){
if(null == input){
return null;
}
try{
T object = (T) xStream.fromXML(input);
return object;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 從一個URL中反序列化一個對象
* @param url
* @return
*/
public <T> T xmlToPojo(URL url,Class<T> cls){
if(null == url){
return null;
}
try{
T object =(T)xStream.fromXML(url);
return object;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 從一個File中反序列化一個對象
* @param file
* @param cls
* @param <T>
* @return
*/
public <T> T xmlToPojo(File file,Class<T> cls){
if(null == file){
return null;
}
try{
T object = (T)xStream.fromXML(file);
return object;
}catch(Exception e ){
e.printStackTrace();
}
return null;
}
}
public static void main(String[] args) {
XStreamUtil xs=XStreamUtil.getInstance();
User u=new User();
u.setAge(90);
u.setId(9);
String xmlStr=xs.pojoToXml(u);
System.out.println(xmlStr);
//com.thoughtworks.xstream.security.ForbiddenClassException 錯誤
//xs.setXStreamAllowTypes(new Class[] { User.class,Tvo2.class});
//xs.setXStremProcessAnnotations(new Class[] { User.class,Tvo2.class});
User us=xs.xmlToPojo(xmlStr, User.class);
System.out.println(u.toString());
Tvo2 t=new Tvo2();
t.setName("6666");
String ts= xs.pojoToXml(t);
System.out.println(ts);
//xs.setXStreamAllowTypes(new Class[] { Tvo2.class});
//xs.setXStremProcessAnnotations(new Class[] { Tvo2.class});
Tvo2 to=xs.xmlToPojo(ts, Tvo2.class);
System.out.println(to.toString());
}