public static void main(String[] args) {
XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
boolean cdata = false;
@Override
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
cdata = (name.equals("converter") || name
.equals("name"));
}
@Override
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});
// XppDriver xppDriver = new XppDriver(new XmlFriendlyReplacer(”__”, “_”)) {
// public HierarchicalStreamWriter createWriter(Writer out){
// return new PrettyPrintWriter(out,super.xmlFriendlyReplacer()) {
// protected void writeText(QuickWriter writer,String text) {
// writer.write(”<![CDATA[");
// writer.write(text);
// writer.write("]]>”);
// }
// };
// }
// };
// XStream xStream = new XStream(xppDriver);
xstream.registerConverter(new PersonConverter());
xstream.alias("converter", Person.class);
System.out.println(xstream.toXML(new Person("zzz","123","ssdsd")));
package converter;
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;
public class PersonConverter implements Converter {
public boolean canConvert(Class clazz) {
return clazz.equals(Person.class);
}
/**
**Marshal方法是用来将对象转换为XML的,他有三个参数:
1,我们准备转换的对象
2,我们准备输出对象的writer
3,当前的marshaling context
*/
@Override
public void marshal(Object value, HierarchicalStreamWriter writer,
MarshallingContext context) {
Person person = (Person) value;
//创建一个叫做fullname的节点,并将person的名字传给他
//可以任意次数的调用start/end node方法,但需要记住,你必须在打开一个节点之后记住关闭它。
//一般来说,执行转换的操作在setValue方法调用时发生
writer.startNode("fullname");
writer.setValue(person.getName());
writer.endNode();
writer.startNode("age");
writer.setValue(person.getAge());
writer.endNode();
}
@Override
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
Person person = new Person();
//使用moveDown和moveUp方法在节点树层次中移动,所以,这里我们只需要简单的moveDown,得到值,再moveUp
reader.moveDown();
person.setName(reader.getValue());
reader.moveUp();
return person;
}
}
输出结果:
<converter> <fullname><![CDATA[zzz]]></fullname> <age><![CDATA[123]]></age> </converter>