XStream使用详解
1.Xstream介绍
class Person//JavaBean实体类{private String name;private int age;public Person(String name,int age){this.name=name;this.age=age;}@Overridepublic String toString(){return "Person [name=" + name + ", age=" + age + "]";}}public class Test{public static void main(String[] args){Person bean=new Person("张三",19);XStream xstream = new XStream();//XML序列化String xml = xstream.toXML(bean);System.out.println(xml);//XML反序列化bean=(Person)xstream.fromXML(xml);System.out.println(bean);xstream = new XStream(new JettisonMappedXmlDriver());xstream.setMode(XStream.NO_REFERENCES);//Json序列化String json=xstream.toXML(bean);System.out.println(json);//Json反序列bean=(Person)xstream.fromXML(json);System.out.println(bean);}}
<test.Person><name>张三</name><age>19</age></test.Person>Person [name=张三, age=19]{"test.Person":{"name":"张三","age":19}}Person [name=张三, age=19
2.Xstream的基本使用
public class Test{public static void main(String[] args){Person bean=new Person("张三",19);//XStream xstream = new XStream();//需要XPP3库//XStream xstream = new XStream(new DomDriver());//不需要XPP3库XStream xstream = new XStream(new StaxDriver());//不需要XPP3库开始使用Java6xstream.alias("人",Person.class);//为类名节点重命名//XML序列化String xml = xstream.toXML(bean);System.out.println(xml);//XML反序列化bean=(Person)xstream.fromXML(xml);System.out.println(bean);}}
<?xml version="1.0" ?><人><name>张三</name><age>19</age></人>Person [name=张三, age=19]
public class Test{public static void main(String[] args){Person bean=new Person("张三",19);XStream xstream = new XStream(new JettisonMappedXmlDriver());//设置Json解析器xstream.setMode(XStream.NO_REFERENCES);//设置reference模型,不引用xstream.alias("人",Person.class);//为类名节点重命名//Json序列化String xml = xstream.toXML(bean);System.out.println(xml);//Json反序列化bean=(Person)xstream.fromXML(xml);System.out.println(bean);}}
{"人":{"name":"张三","age":19}}Person [name=张三, age=19]
3.Xstream序列化重命名
public class Test{public static void main(String[] args){Person bean=new Person("张三",19);XStream xstream = new XStream();xstream.aliasPackage("com.lzw", "test");//为包名称重命名//序列化String xml = xstream.toXML(bean);System.out.println(xml);//反序列化bean=(Person)xstream.fromXML(xml);System.out.println(bean);}}
<com.lzw.Person><name>张三</name><age>19</age></com.lzw.Person>Person [name=张三, age=19]
public class Test{public static void main(String[] args){Person bean=new Person("张三",19);XStream xstream = new XStream();xstream.alias("人", Person.class);//为类名节点重命名//序列化String xml = xstream.toXML(bean);System.out.println(xml);//反序列化bean=(Person)xstream.fromXML(xml);System.out.println(bean);}}
<人><name>张三</name><age>19</age></人>Person [name=张三, age=19]
public class Test{public static void main(String[] args){Person bean=new Person("张三",19);XStream xstream = new XStream();xstream.aliasField("姓名", Person.class,"name");//为类的字段节点重命名xstream.aliasField("年龄", Person.class,"age");//为类的字段节点重命名//序列化String xml = xstream.toXML(bean);System.out.println(xml);//反序列化bean=(Person)xstream.fromXML(xml);System.out.println(bean);}}
<test.Person><姓名>张三</姓名><年龄>19</年龄></test.Person>Person [name=张三, age=19]
class Person{private String name;private int age;private List friends;public Person(String name, int age, String... friends){this.name = name;this.age = age;this.friends = Arrays.asList(friends);}@Overridepublic String toString(){return "Person [name=" + name + ", age=" + age + ", friends=" + friends + "]";}}public class Test{public static void main(String[] args){Person bean =new Person("张三",19,"李四","王五","赵六");XStream xstream = new XStream();xstream.addImplicitCollection(Person.class, "friends");//省略集合根节点//序列化String xml = xstream.toXML(bean);System.out.println(xml);//反序列化bean=(Person)xstream.fromXML(xml);System.out.println(bean);}}
<test.Person><name>张三</name><age>19</age><string>李四</string><string>王五</string><string>赵六</string></test.Person>Person [name=张三, age=19, friends=[李四, 王五, 赵六]]
public class Test{public static void main(String[] args){Person bean =new Person("张三",19,"李四","王五","赵六");XStream xstream = new XStream();xstream.useAttributeFor(Person.class, "name");//把字段节点设置成属性//序列化String xml = xstream.toXML(bean);System.out.println(xml);//反序列化bean=(Person)xstream.fromXML(xml);System.out.println(bean);}}
<test.Person name="张三"><age>19</age><friends class="java.util.Arrays$ArrayList"><a class="string-array"><string>李四</string><string>王五</string><string>赵六</string></a></friends></test.Person>Person [name=张三, age=19, friends=[李四, 王五, 赵六]]
public class Test{public static void main(String[] args){Person bean =new Person("张三",19,"李四","王五","赵六");XStream xstream = new XStream();xstream.omitField(Person.class, "friends");//把字段节点隐藏//序列化String xml = xstream.toXML(bean);System.out.println(xml);//反序列化bean=(Person)xstream.fromXML(xml);System.out.println(bean);}}
<test.Person><name>张三</name><age>19</age></test.Person>Person [name=张三, age=19, friends=null]
4.Xstream注解的使用
XStream xstream = new XStream();xstream.processAnnotations(Person.class);//应用Person类的注解xstream.autodetectAnnotations(true);//自动检测注解
@XStreamAlias("人")class Person{@XStreamAlias("姓名")private String name;@XStreamAlias("年龄")private int age;@XStreamAlias("朋友")private List friends;public Person(String name, int age, String... friends){this.name = name;this.age = age;this.friends = Arrays.asList(friends);}@Overridepublic String toString(){return "Person [name=" + name + ", age=" + age + ", friends=" + friends + "]";}}
<人><姓名>张三</姓名><年龄>19</年龄><朋友 class="java.util.Arrays$ArrayList"><a class="string-array"><string>李四</string><string>王五</string><string>赵六</string></a></朋友></人>Person [name=张三, age=19, friends=[李四, 王五, 赵六]]
class Person{private String name;private int age;//@XStreamImplicit//只隐藏集合根节点@XStreamImplicit(itemFieldName="朋友")//设置重复的节点名,可能会导致无法反序列化private List<String> friends;public Person(String name, int age, String... friends){this.name = name;this.age = age;this.friends = Arrays.asList(friends);}@Overridepublic String toString(){return "Person [name=" + name + ", age=" + age + ", friends=" + friends + "]";}}
<test.Person><name>张三</name><age>19</age><朋友>李四</朋友><朋友>王五</朋友><朋友>赵六</朋友></test.Person>Person [name=张三, age=19, friends=[李四, 王五, 赵六]]
class Person{@XStreamAsAttributeprivate String name;@XStreamAsAttributeprivate int age;private List<String> friends;public Person(String name, int age, String... friends){this.name = name;this.age = age;this.friends = Arrays.asList(friends);}@Overridepublic String toString(){return "Person [name=" + name + ", age=" + age + ", friends=" + friends + "]";}}
<test.Person name="张三" age="19"><friends class="java.util.Arrays$ArrayList"><a class="string-array"><string>李四</string><string>王五</string><string>赵六</string></a></friends></test.Person>Person [name=张三, age=19, friends=[李四, 王五, 赵六]]
class Person{private String name;private int age;@XStreamOmitFieldprivate List<String> friends;public Person(String name, int age, String... friends){this.name = name;this.age = age;this.friends = Arrays.asList(friends);}@Overridepublic String toString(){return "Person [name=" + name + ", age=" + age + ", friends=" + friends + "]";}}
<test.Person><name>张三</name><age>19</age></test.Person>Person [name=张三, age=19, friends=null]
class Person{private String name;private int age;@XStreamConverter(value=BooleanConverter.class,booleans={false},strings={"男","女"})private boolean sex;public Person(String name, int age, boolean sex){this.name = name;this.age = age;this.sex=sex;}@Overridepublic String toString(){return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";}}
<test.Person><name>张三</name><age>19</age><sex>男</sex></test.Person>Person [name=张三, age=19, sex=true]
5.Xstream自定义的转换器
class Person{private String name;private int age;public Person(String name, int age){this.name = name;this.age = age;}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;}@Overridepublic String toString(){return "Person [name=" + name + ", age=" + age + "]";}}public class PersonConverter implements Converter{@Override//定义转换器能转换的JavaBean类型public boolean canConvert(Class type){return type.equals(Person.class);}@Override//把对象序列化成XML或Jsonpublic void marshal(Object value, HierarchicalStreamWriter writer,MarshallingContext context){Person person = (Person) value;writer.startNode("姓名");writer.setValue(person.getName());writer.endNode();writer.startNode("年龄");writer.setValue(person.getAge()+"");writer.endNode();writer.startNode("转换器");writer.setValue("自定义的转换器");writer.endNode();}@Override//把XML或Json反序列化成对象public Object unmarshal(HierarchicalStreamReader reader,UnmarshallingContext context){Person person = new Person("",-1);reader.moveDown();person.setName(reader.getValue());reader.moveUp();reader.moveDown();person.setAge(Integer.parseInt(reader.getValue()));reader.moveUp();return person;}}public class Test{public static void main(String[] args){Person bean =new Person("张三",19);XStream xstream = new XStream();xstream.registerConverter(new PersonConverter());//注册转换器//序列化String xml = xstream.toXML(bean);System.out.println(xml);//反序列化bean=(Person)xstream.fromXML(xml);System.out.println(bean);}}
<test.Person><姓名>张三</姓名><年龄>19</年龄><转换器>自定义的转换器</转换器></test.Person>Person [name=张三, age=19]
6.Xstream对象流的使用
class Person{private String name;private int age;public Person(String name, int age){this.name = name;this.age = age;}}public class Test{public static void main(String[] args) throws IOException{XStream xstream = new XStream();ObjectOutputStream out = xstream.createObjectOutputStream(System.out);out.writeObject(new Person("张三",12));out.writeObject(new Person("李四",19));out.writeObject("Hello");out.writeInt(12345);out.close();}}
<object-stream><test.Person><name>张三</name><age>12</age></test.Person><test.Person><name>李四</name><age>19</age></test.Person><string>Hello</string><int>12345</int></object-stream>
class Person{private String name;private int age;public Person(String name, int age){this.name = name;this.age = age;}@Overridepublic String toString(){return "Person [name=" + name + ", age=" + age + "]";}}public class Test{public static void main(String[] args) throws IOException, ClassNotFoundException{String s="<object-stream><test.Person><name>张三</name><age>12</age></test.Person><int>12345</int></object-stream>";StringReader reader = new StringReader(s);XStream xstream = new XStream();ObjectInputStream in = xstream.createObjectInputStream(reader);System.out.println((Person) in.readObject());System.out.println(in.readInt());}}
Person [name=张三, age=12]12345
7.Xstream持久化API
class Person{private String name;private int age;public Person(String name, int age){this.name = name;this.age = age;}@Overridepublic String toString(){return "Person [name=" + name + ", age=" + age + "]";}}public class Test{public static void main(String[] args) throws IOException, ClassNotFoundException{PersistenceStrategy strategy = new FilePersistenceStrategy(new File("D:\\tmp"));List list = new XmlArrayList(strategy);list.add(new Person("张三",13));//保存数据list.add(new Person("李四",21));list.add(new Person("王五",17));}}
public class Test{public static void main(String[] args) throws IOException, ClassNotFoundException{PersistenceStrategy strategy = new FilePersistenceStrategy(new File("D:\\tmp"));List list = new XmlArrayList(strategy);for (Iterator it = list.iterator(); it.hasNext();){System.out.println((Person) it.next());it.remove();//删除对象序列化文件}}}
Person [name=张三, age=13]Person [name=李四, age=21]Person [name=王五, age=17]
8.Xstream操作Json
@XStreamAlias("人")class Person{@XStreamAlias("姓名")private String name;@XStreamAlias("年龄")private int age;public Person(String name, int age){this.name = name;this.age = age;}@Overridepublic String toString(){return "Person [name=" + name + ", age=" + age + "]";}}public class Test{public static void main(String[] args){Person bean=new Person("张三",19);XStream xstream = new XStream(new JettisonMappedXmlDriver());//设置Json解析器xstream.autodetectAnnotations(true);//Json序列化String xml = xstream.toXML(bean);System.out.println(xml);//Json反序列化bean=(Person)xstream.fromXML(xml);System.out.println(bean);}}
{"人":{"姓名":"张三","年龄":19}}Person [name=张三, age=19]
class Person{private String name;private int age;public Person(String name, int age){this.name = name;this.age = age;}@Overridepublic String toString(){return "Person [name=" + name + ", age=" + age + "]";}}public class Test00{public static void main(String[] args){Person bean=new Person("张三",19);XStream xstream = new XStream(new JsonHierarchicalStreamDriver(){public HierarchicalStreamWriter createWriter(Writer writer){return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);}});//Json序列化String xml = xstream.toXML(bean);System.out.println(xml);}}
{"name": "张三", "age": 19 }
- JettisonMappedXmlDriver:是支持序列化和反序列化Json的。
- JsonHierarchicalStreamDriver:只支持序列化,不支持反序列化。
XStream使用详解的更多相关文章
- Spring MVC测试框架详解——服务端测试
随着RESTful Web Service的流行,测试对外的Service是否满足期望也变的必要的.从Spring 3.2开始Spring了Spring Web测试框架,如果版本低于3.2,请使用sp ...
- SpringMvc测试框架详解----服务端测试
随着RESTful Web Service的流行,测试对外的Service是否满足期望也变的必要的.从Spring 3.2开始Spring了Spring Web测试框架,如果版本低于3.2,请使用sp ...
- Spring学习(一)-----Spring 模块详解
官方下载链接:http://repo.spring.io/release/org/springframework/spring/ Spring 模块详解: Core 模块 spring-beans-3 ...
- struts-2.3.24.1中的jar的详解
Struts2.3.24.1核心Jar包详解 antlr-2.7.2.jar 语言转换工具,它是接受词文法语言描述,并能产生识别这些语言的语句的程序的一种工具 a ...
- maven打包插件详解
maven-jar-plugin插件的使用及详解 该插件的xml配置及详解如下: <plugin> <groupId>org.apache.maven.plugins</ ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
随机推荐
- IIS 7.5 配置Asp+Access的几点注意的地方
环境:window2008 R2 + iis 7.51 把网站程序放在一个www文件夹里面,给这个文件夹添加everyone的用户,赋予全部读写权限,这样安全些.2 选中要配置的网站,点击页面中间“A ...
- php codebase生成随机数
php使用codebase生成随机数. 有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次.前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空.那么你会如 ...
- 亚信联创--java面试题目总结
这几天投简历,只有两家的HR表示感兴趣.易思卓越和亚信联创,不管怎样如果能有机会面试都一定尽力表现,所以找了找网上的面经,这里先把题目总结一下. 职位要求如下: ------------------- ...
- VM虚拟机无法拖拽、粘贴、复制
VM无法从客户机拖放/复制文件到虚拟机的解决办法: 将这两项取消勾选,点击[确定].再次打开,勾选,点击[确定] 原因分析:可能是VM中默认是不支持该功能的,但是在配置窗体上确实默认打钩打上的. 依据 ...
- STM32F4_TIM输出PWM波形(可调频率、占空比)
Ⅰ.概述 上一篇文章关于STM32基本的计数原理明白之后,该文章是在其基础上进行拓展,讲述关于STM32比较输出的功能,以输出PWM波形为实例来讲述. 提供实例工程中比较实用的函数:只需要调用该函数, ...
- MvcAdmin功能介绍
应群友要求做一个介绍(QQ群:159227188) 已经迁移到这里,已经迁移到这里,已经迁移到这里,重要的事情说三遍 http://www.cnblogs.com/RainbowInTheSky/p/ ...
- Linux驱动开发之字符设备模板
/***************************** ** 驱动程序模板* 版本:V1* 使用方法(末行模式下):* :%s/xxx/"你的驱动名称"/g********* ...
- Effiective C++ (一)
最近在看Effective C++ ,同时将总结一下里边的重要知识点: ########################## module 1 #################### ...
- 启动FM预算基金管理模块后,0L总账消失的解决办法
只要用SE38运行一下:FMGL_CHANGE_APPL_IN_LEDGER 问题就解决了.
- hdu 1042 N!
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1042 N! Description Given an integer N(0 ≤ N ≤ 10000) ...