XStream 工具類

話不多說,直接上代碼 

首先下載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());
    }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章