其实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 + "]";
- }
- }
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);
- }
- }
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]
<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]
{"Person":{"@name":"cc","age":30,"sex":false,"favor":["游戏","上网"]}}
Person [name=cc, age=30, sex=false, favor=[游戏, 上网], tempid=0]