其实XStream和JAXB在一些观念上是很相似的
但是JAXB作为Java EE的一个规范 是非常正式的 且和其他很多规范有联系 是一种标准的实现
这边简单说说实现方式(博客里有文介绍使用):
1.一个实体类,使用@XmlRootElement表示一下类(最简单的)
2.建立一个ObjectFactory用来产生这个实体类
3.使用JAXBContext 然后产生Marshaller(对象-->xml)或者UnMarshaller(xml-->对象)
而XStream使用起来更为简单
1.首先从XStream官网下载XStream
http://xstream.codehaus.org/download.html
2.下载后解压 将lib下的jar添加入项目就可以了
如下:
然后就可以编写代码了
为了方便 直接使用XStream的annotation:
3.实体类 Person:
package org.cc.vo; import java.util.List; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import com.thoughtworks.xstream.annotations.XStreamImplicit; import com.thoughtworks.xstream.annotations.XStreamOmitField; @XStreamAlias("Person") public class Person { @XStreamAlias("name") @XStreamAsAttribute private String name; @XStreamAlias("age") private int age; @XStreamAlias("sex") private boolean sex; @XStreamImplicit(itemFieldName="favor") private List<String> favor; @XStreamOmitField private int tempid; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isSex() { return sex; } public void setSex(boolean sex) { this.sex = sex; } public List<String> getFavor() { return favor; } public void setFavor(List<String> favor) { this.favor = favor; } public int getTempid() { return tempid; } public void setTempid(int tempid) { this.tempid = tempid; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", favor=" + favor + ", tempid=" + tempid + "]"; } }
@XStreamAlias(value)是别名 可以用在类名和属性名上修改显示的xml中的标签
@XStreamAsAttribute 把属性作为xml中的属性 而不是子元素
@XStreamImplicit(itemFieldName="favor") 还有一个keyFieldName的属性 这个是用来改写List和Map的显示 的
@XStreamOmitField 此标记的属性不会序列化
4.接下去只有一步,没有JAXB的建立ObjectFactory那一部,实现起来非常简洁直观:
package org.cc.vo; import java.util.ArrayList; import java.util.List; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver; public class Main { public static void main(String[] args) { XStream x=new XStream(); // XStream x = new XStream(new JettisonMappedXmlDriver()); x.processAnnotations(Person.class); Person p=new Person(); p.setAge(30); List<String> fa=new ArrayList<String>(); fa.add("游戏"); fa.add("上网"); p.setFavor(fa); p.setName("cc"); String info=x.toXML(p); System.out.println(info); Person p2=(Person)x.fromXML(info); System.out.println(p2); } }
输出:
<Person name="cc"> <age>30</age> <sex>false</sex> <favor>游戏</favor> <favor>上网</favor> </Person> Person [name=cc, age=30, sex=false, favor=[游戏, 上网], tempid=0]
注意了以上代码注释掉的那块打开 并把没有参数的构造方法的XStream那一段注释掉产生的就是JSON(换了一个引擎)
产生内容如下:
{"Person":{"@name":"cc","age":30,"sex":false,"favor":["游戏","上网"]}} Person [name=cc, age=30, sex=false, favor=[游戏, 上网], tempid=0]