一篇解答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/
官网: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/
相关文章推荐
- 关于***在DEBUG过程中可能出现的问题
- matlab中textread()函数使用过程中可能出现的问题
- String中“”和“0”转换为Integer过程中出现的问题
- JIRA使用过程出现问题整理解答
- java mysql配置过程及可能出现的问题整理
- 《见习小恶魔》源代码编译过程中可能出现的问题及解决方法
- MySQL 5.7.20.0下载、图解安装、可能出现的问题、验证是否安装成功(一篇解决)
- ubuntu下整合eclipse和tomcat的过程以及可能出现的问题
- 用Atom打造简单的java编译器以及对于可能出现的问题解答
- SWFTOOL安装过程及可能出现的问题
- 费用报销过程中可能出现的问题
- tensorflow安装:Ubuntu系统下tensorflow安装过程可能出现的问题及解决方案
- SQL Server2005安装过程中可能出现的问题
- 费用报销过程中可能出现的问题
- 把 JSON 文本转换为 JavaScript 对象时可能出现的问题
- MySQL 5.7.20.0下载、图解安装、可能出现的问题、验证是否安装成功(一篇解决)
- Android开发,关于php服务器文件传输过程出现的问题:中文名文件名在url中的转换
- WEB工程的创建、运行过程及可能出现的问题
- JS中将日期字符串转换为日期型过程中出现的问题
- 安装EVC过程中可能出现的问题