1 xStream框架
xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换;
官网:
http://xstream.codehaus.org/
2 about xtream
xtream 是一个简单的工具包,用来把对象序列化成xml配置文件,并且也可以把xml反序化成对象。
4Features 功能特点
简单易用,不需要配置映射,速度快并且占用内存小,生成的xml配置文件很干净,不带额外无用信息,这样在反映序列化的时候容易读取。不需要修改序列化对象的类型。支持类图。与xmlapi 整合。详细的返回错误信息。可修改的输出 显示。
4 点型应用
传输:网络传输
持久化:生成的XML可以写到文件,做持久化。
配置:XML最常用的配置文件。
单元测试
5局限
If using the enhanced mode, XStream can re-instantiate classes that do not have a default constructor. However, if using a different JVM like an old JRockit version, a JDK 1.3 or you have restrictions because of a SecurityManager, a default constructor is required.
The enhanced mode is also necessary to restore final fields for any JDK < 1.5. This implies deserialization of instances of an inner class.
Auto-detection of annotations may cause race conditions. Preprocessing annotations is safe though.
6准备一个pojo对象
package com.entity;
import java.util.Date;
public class Student {
private int id;
private String name;
private String email;
private String address;
private Birthday birthday;
private Date registDate;
public Date getRegistDate() {
return registDate;
}
public void setRegistDate(Date registDate) {
this.registDate = registDate;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Birthday getBirthday() {
return birthday;
}
public void setBirthday(Birthday birthday) {
this.birthday = birthday;
}
// getter、setter
public String toString() {
return this.name + "#" + this.id + "#" + this.address + "#"
+ this.birthday + "#" + this.email;
}
}
7 bean 转成 xml
测试代码:
package com.test;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;
import org.junit.Before;
import org.junit.Test;
import com.entity.Birthday;
import com.entity.Student;
import com.thoughtworks.xstream.XStream;
@SuppressWarnings("unchecked")
public class XStreamTest {
private XStream xstream = null;
private ObjectOutputStream out = null;
private ObjectInputStream in = null;
private Student bean = null;
@Before
public void init() {
try {
xstream = new XStream();
bean = getTestStudent();
// xstream = new XStream(new DomDriver()); // 需要xpp3 jar
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
XStreamTest test = new XStreamTest();
test.init();
test.testWriteBean2XML_01();
}
public final void fail(String string) {
System.out.println(string);
}
public final void failRed(String string) {
System.err.println(string);
}
/**
* bean 2 XML
* */
@Test
public void testWriteBean2XML_01() {
try {
fail("------------Bean->XML------------");
fail(xstream.toXML(bean));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 类重命名后的XML
* */
@Test
public void testWriteBean2XML_02() {
try {
fail("-----------类重命名后的XML------------");
// 类重命名
xstream.alias("student", Student.class);
xstream.aliasField("生日", Student.class, "birthday");
xstream.aliasField("生日日期", Birthday.class, "birthday");
fail(xstream.toXML(bean));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 类重命名后的XML
* */
@Test
public void testWriteBean2XML_03() {
try {
fail("-----------属性重命名后的XML------------");
// 属性重命名
xstream.aliasField("邮件", Student.class, "email");
fail(xstream.toXML(bean));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 包重命名后的XML
* */
@Test
public void testWriteBean2XML_04() {
try {
fail("-----------包重命名后的XML------------");
//包重命名
xstream.aliasPackage("modile", "com.entity");
fail(xstream.toXML(bean));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 构造数据
* */
private Student getTestStudent() {
Student bean = new Student();
bean.setAddress("china");
bean.setEmail("[email protected]");
bean.setId(1);
bean.setName("jack");
Birthday day = new Birthday();
day.setBirthday("2010-11-22");
bean.setBirthday(day);
bean.setRegistDate(new Date());
return bean;
}
}
测试结果:
------------Bean->XML------------
<com.entity.Student>
<id>1</id>
<name>jack</name>
<email>
[email protected]</email>
<address>china</address>
<birthday>
<birthday>2010-11-22</birthday>
</birthday>
<registDate>2011-07-11 22:33:02.359 CST</registDate>
</com.entity.Student>
-----------类重命名后的XML------------
<student>
<id>1</id>
<name>jack</name>
<email>
[email protected]</email>
<address>china</address>
<生日>
<生日日期>2010-11-22</生日日期>
</生日>
<registDate>2011-07-11 22:33:02.390 CST</registDate>
</student>
-----------属性重命名后的XML------------
<com.entity.Student>
<id>1</id>
<name>jack</name>
<邮件>
[email protected]</邮件>
<address>china</address>
<birthday>
<birthday>2010-11-22</birthday>
</birthday>
<registDate>2011-07-11 22:33:02.406 CST</registDate>
</com.entity.Student>
-----------包重命名后的XML------------
<modile.Student>
<id>1</id>
<name>jack</name>
<email>
[email protected]</email>
<address>china</address>
<birthday>
<birthday>2010-11-22</birthday>
</birthday>
<registDate>2011-07-11 22:33:02.406 CST</registDate>
</modile.Student>
8 List 2 XML
fail("------------Listg<Strudent>->XML------------");
List<Student> list = new ArrayList<Student>();
list.add(bean);
Student s1 = getTestStudent();
s1.setId(2);
list.add(s1);
fail(xstream.toXML(list));
结果:
------------Listg<Strudent>->XML------------
<list>
<com.entity.Student>
<id>1</id>
<name>jack</name>
<email>
[email protected]</email>
<address>china</address>
<birthday>
<birthday>2010-11-22</birthday>
</birthday>
<registDate>2011-07-11 22:47:08.0 CST</registDate>
</com.entity.Student>
<com.entity.Student>
<id>2</id>
<name>jack</name>
<email>
[email protected]</email>
<address>china</address>
<birthday>
<birthday>2010-11-22</birthday>
</birthday>
<registDate>2011-07-11 22:47:08.0 CST</registDate>
</com.entity.Student>
</list>