您的位置:首页 > 其它

一篇解答xstream转换过程中可能出现问题的作文

2013-09-16 10:29 253 查看
转自:http://am-human.iteye.com/blog/1496520

官网:http://xstream.codehaus.org/index.html 

使用中需要注意的问题: 
1.java对象的字段如果有下划线xstream转成xml时会变成双下划线,解决办法: 

Java代码  


XStream xs = new XStream(new XppDriver(new XmlFriendlyReplacer("__", "_")));  

2.xstream默认的时间串格式较少,在默认不满足的情况下,需要自己实现Converter接口,并注册到xstream中 

3.在java对象比较复杂的情况下,为了代码组织方便,使用静态内部类是个好办法。注:使用普通内部类转换后的xml会生成依赖声明 

Java代码  


package com.iteye.am-human.message.msgDefinition;  

  

import com.thoughtworks.xstream.XStream;  

import com.thoughtworks.xstream.io.xml.XmlFriendlyReplacer;  

import com.thoughtworks.xstream.io.xml.XppDriver;  

  

/** 

 * 消息结构的抽象基类 

 *  

 * @author Wuyc 

 * 

 */  

public abstract class BaseMsg {  

    public BaseMsg(){}  

      

    public BaseMsg(Head head) {  

        super();  

        this.head = head;  

    }  

  

    public BaseMsg(int commandId){  

        super();  

        this.head = new Head(commandId,getSequence());  

    }  

      

    private Head head;  

      

    public Head getHead() {  

        return head;  

    }  

  

    public void setHead(Head head) {  

        this.head = head;  

    }  

      

    /** 

     * 将当前对象转换成xml数据 

     *  

     * @return xml数据 

     */  

    public String toXml(){  

        XStream xs = new XStream(new XppDriver(new  

                XmlFriendlyReplacer("_-", "_")));  

        xs.autodetectAnnotations(true);  

        return xs.toXML(this);  

    }  

      

    protected static String getSequence(){  

        return "1"+Math.round(Math.random()*10e14);  

    }  

}  

Java代码  


package com.iteye.am-human.message.msgDefinition;  

  

import java.util.ArrayList;  

import java.util.Date;  

import java.util.List;  

  

import com.thoughtworks.xstream.XStream;  

import com.thoughtworks.xstream.annotations.XStreamAlias;  

import com.thoughtworks.xstream.io.xml.DomDriver;  

  

/** 

 * <xmp> 

 * <?xml version="1.0" encoding="UTF-8" ?> 

 * <root> 

 *  <head> 

 *      <command>5011</command> 

 *      <sequence>编号</sequence> 

 *  </head> 

 *  <body> 

 *      <data> 

 *          <flow_list> 

 *              <flow> 

 *                  <flow_instance_id></flow_instance_id> 

 *                  <flow_status></flow_status> 

 *                  <flow_start_time></flow_start_time> 

 *                  <srv_list> 

 *                      <service> 

 *                          <service_id></service_id> 

 *                          <proc_list> 

 *                              <proc> 

 *                                  <proc_id></proc_id> 

 *                                  <pid></pid> 

 *                                  <vm_id></vm_id> 

 *                                  <handle_count></handle_count> 

 *                                  <handle_speed></handle_speed> 

 *                                  <proc_start_time></proc_start_time> 

 *                              </proc> 

 *                          </proc_list> 

 *                      </service> 

 *                  </srv_list> 

 *              </flow> 

 *          </flow_list> 

 *      </data> 

 *  </body> 

 * </root> 

 * </xmp> 

 *  

 * @author Wuyc 

 * 

 */  

@XStreamAlias("root")  

public class Msg5011Def extends BaseMsg {  

    private static final int COMMAND_ID = 5011;  

      

    private Body body;  

      

    public Msg5011Def(){  

        super(COMMAND_ID);  

        this.body = new Body();  

    }  

      

    public static Msg5011Def fromXml(String xml){  

        XStream xstream = new XStream(new DomDriver());  

        xstream.alias("root",Msg5011Def.class);  

        xstream.alias("flow",Msg5011Def.Body.Data.Flow.class);  

        xstream.alias("service",Msg5011Def.Body.Data.Flow.Service.class);  

        xstream.alias("proc",Msg5011Def.Body.Data.Flow.Service.Process.class);  

        xstream.registerConverter(new DateSingleValueConverter());  

        return (Msg5011Def)xstream.fromXML(xml);  

    }  

      

    public static class Body extends BaseBody{  

        private Data data;  

          

        public Body(){  

            this.data = new Data();  

        }  

          

        public static class Data{  

            private List<Flow> flow_list;  

              

            public Data(){  

                this.flow_list = new ArrayList<Flow>();  

            }  

              

            @XStreamAlias("flow")  

            public static class Flow{  

                private int flow_instance_id;  

                private int flow_status;  

                private Date flow_start_time;  

                  

                private List<Service> srv_list;  

                  

                public Flow(){  

                    this.srv_list = new ArrayList<Service>();  

                }  

                  

                @XStreamAlias("service")  

                public static class Service{  

                    private int service_id;  

                    private List<Process> proc_list;  

                      

                    public Service(){  

                        this.proc_list = new ArrayList<Process>();  

                    }  

                      

                    @XStreamAlias("proc")  

                    public static class Process{  

                        private int proc_id;  

                        private int pid;  

                        private int vm_id;  

                        private int handle_count;       // 当天的处理量  

                        private float handle_speed;     // 处理速度  

                        private Date proc_start_time;   // 进程启动时间  

                        public int getProc_id() {  

                            return proc_id;  

                        }  

                        public int getPid() {  

                            return pid;  

                        }  

                        public int getVm_id() {  

                            return vm_id;  

                        }  

                        public int getHandle_count() {  

                            return handle_count;  

                        }  

                        public float getHandle_speed() {  

                            return handle_speed;  

                        }  

                        public Date getProc_start_time() {  

                            return proc_start_time;  

                        }  

                    }  

                    public int getService_id() {  

                        return service_id;  

                    }  

                    public List<Process> getProc_list() {  

                        return proc_list;  

                    }  

                }  

  

                public int getFlow_instance_id() {  

                    return flow_instance_id;  

                }  

  

                public int getFlow_status() {  

                    return flow_status;  

                }  

  

                public List<Service> getSrv_list() {  

                    return srv_list;  

                }  

  

                public Date getFlow_start_time() {  

                    return flow_start_time;  

                }  

            }  

  

            public List<Flow> getFlow_list() {  

                return flow_list;  

            }  

        }  

  

        public Data getData() {  

            return data;  

        }  

    }  

  

    public Body getBody() {  

        return body;  

    }  

}  

Java代码  


package com.iteye.am-human.message.msgDefinition;  

  

import java.util.Date;  

import java.text.ParseException;  

import java.text.SimpleDateFormat;  

  

import com.thoughtworks.xstream.converters.Converter;  

import com.thoughtworks.xstream.converters.MarshallingContext;  

import com.thoughtworks.xstream.converters.UnmarshallingContext;  

import com.thoughtworks.xstream.io.HierarchicalStreamReader;  

import com.thoughtworks.xstream.io.HierarchicalStreamWriter;  

  

/** 

 * Date数据转换器 

 * 默认的format格式为:yyyyMMddHHmmss 

 *  

 * @author Wuyc 

 * 

 */  

public class DateSingleValueConverter implements Converter {  

    private SimpleDateFormat sdf;  

      

    public DateSingleValueConverter(){  

        this.sdf = new SimpleDateFormat("yyyyMMddHHmmss");  

    }  

      

    public DateSingleValueConverter(String formatString){  

        this.sdf = new SimpleDateFormat(formatString);   

    }  

  

      

    public void marshal(Object arg0, HierarchicalStreamWriter writer,  

            MarshallingContext arg2) {  

        Date date = (Date)arg0;  

        writer.setValue(sdf.format(date));  

    }  

  

    public Object unmarshal(HierarchicalStreamReader reader,  

            UnmarshallingContext arg1) {  

        Date date = null;  

        try {  

            String strDate = reader.getValue();  

            if(strDate != null && strDate.length()!=0 && !"".equals(strDate) && !"0".equals(strDate)){  

                date = sdf.parse(reader.getValue());  

            }  

        } catch (ParseException e) {  

            e.printStackTrace();  

        }  

        return date;  

    }  

  

    public boolean canConvert(Class type) {  

        return Date.class.equals(type);  

    }  

  

}  

其他的xml转换框架: 
castor 
官网:http://www.castor.org/ 
通过定义mapping文件,实现xml和javabean的对应。 

JOX 
官网:http://www.wutka.com/jox.html 
sourceforge(官网打不开):http://sourceforge.net/projects/jox/ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xstream 转换 下划线