XStream - A simple library to serialize objects to XML and back again.

官网:[url]http://xstream.codehaus.org/index.html[/url]

使用中需要注意的问题:
1.java对象的字段如果有下划线xstream转成xml时会变成双下划线,解决办法:
XStream xs = new XStream(new XppDriver(new XmlFriendlyReplacer("_-", "_")));

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

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

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);
}
}


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;
}
}


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
官网:[url]http://www.castor.org/[/url]
通过定义mapping文件,实现xml和javabean的对应。

JOX
官网:[url]http://www.wutka.com/jox.html[/url]
sourceforge(官网打不开):[url]http://sourceforge.net/projects/jox/[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值