XStream工具简单教程

XStream工具简单教程XStream 简单教程 阅读目录 XStream 介绍 XStream 的基本使用 XStrea 序列化重命名 XStream 注解的使用 XStream 自定义转换器 XStream 对象流的使用 XStream 对象流的使用 XStream 持久化 APIXStream 操作 JSONXStream 介绍 1 Xstream 是一种 OXMapping 技术 是用来处理 XML 文件序列化的框架 在将 JavaBea

XStream简单教程:

阅读目录

  • XStream介绍
  • XStream的基本使用
  • XStrea序列化重命名
  • XStream注解的使用
  • XStream自定义转换器
  • XStream对象流的使用
  • XStream对象流的使用
  • XStream持久化API
  • XStream操作JSON

XStream介绍

 class Person//JavaBean实体类 { private String name; private int age; public Person(String name,int age) { this.name=name; this.age=age; } @Override public 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] 

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库开始使用Java6 xstream.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] 

XStream序列化重命名

(1)为包重命名:XStream.aliasPackage()方法

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] 

(2)为类重命名:XStream.alias()方法

 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] 

(3)为字段重命名:XStream.aliasField()方法

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] 

(4)省略集合根节点:XStream.addImplicitCollection()方法

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); } @Override public 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=[李四, 王五, 赵六]] 

(5)把字段节点设置成属性:Xstream.useAttributeFor()方法

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=[李四, 王五, 赵六]] 

(6)隐藏字段:xstream.omitField()方法

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] 

XStream注解的使用

 XStream xstream = new XStream(); xstream.processAnnotations(Person.class);//应用Person类的注解 xstream.autodetectAnnotations(true);//自动检测注解 (2)重命名注解:@XStreamAlias() @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); } @Override public 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=[李四, 王五, 赵六]] 

(3)省略集合根节点:@XStreamImplicit

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); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", friends=" + friends + "]"; } } 

程序运行结果:

<test.Person> <name>张三</name> <age>19</age> <朋友>李四</朋友> <朋友>王五</朋友> <朋友>赵六</朋友> </test.Person> Person [name=张三, age=19, friends=[李四, 王五, 赵六]] 

(4)把字段节点设置成属性:@XStreamAsAttribute

class Person { @XStreamAsAttribute private String name; @XStreamAsAttribute private 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); } @Override public 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=[李四, 王五, 赵六]] 

(5)隐藏字段:@XStreamOmitField

 class Person { private String name; private int age; @XStreamOmitField private List<String> friends; public Person(String name, int age, String... friends) { this.name = name; this.age = age; this.friends = Arrays.asList(friends); } @Override public 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] 

(6)设置转换器:@XStreamConverter()

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; } @Override public 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] 

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; } @Override public 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或Json public 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] 
 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; } @Override public 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 

XStream持久化API

(1)保存JavaBean对象

class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public 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)); } } 程序运行结果:如果我们检查D:\tmp目录,有三个文件:、、;每个对象都被序列化到XML文件里。 

(2)读取并删除JavaBean对象

 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] 
class Person { @XStreamAlias("姓名") private String name; @XStreamAlias("年龄") private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public 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; } @Override public 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 } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233412.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux下载安装yum(ubuntu安装yum工具)

    自动搜索最快镜像插件:yuminstallyum-fastestmirror安装yum图形窗口插件:yuminstallyumex1、安装yuminstall全部安装yuminstallpackage1安装指定的安装包package1yumgroupinsallgroup1安装程序组group12、更新和升级yumupdate全部更新yumupdatepackage1更新指定程序包package1yumcheck-update

    2022年4月15日
    53
  • 绝不误人子弟!零基础应该选择学习Java、PHP,还是前端?[通俗易懂]

    绝不误人子弟!零基础应该选择学习Java、PHP,还是前端?[通俗易懂]上周,有读者私信我说,“二哥,零基础该选择Java还是PHP啊?”我瞬间就误了!PHP?世界上最好的编程语言?后来,又有读者私信问我,“挺纠结的,不知道该选前端还是Java?”真不好选,因为“男怕入错行,女怕嫁错郎”,初学者纠结这个问题也是情有可原。首先来说说PHP,Web蛮荒的年代,PHP真的是王者姿态,连Java可能都要礼让三分,但近些年,PHP只能做一些速成型的外包项目了,如果想增加更多的业务,想在性能上有所改善,PHP就真的很难了!所以,本着不误人子弟的原则,我

    2022年5月26日
    31
  • java中array的方法_array java

    java中array的方法_array java题目要求为:卡拉兹(Callatz)猜想:对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接判定卡拉兹猜想的…

    2022年9月20日
    4
  • linux nslookup命令安装,在CentOS中安装nslookup命令

    linux nslookup命令安装,在CentOS中安装nslookup命令域名查询工具nslookup并不是Win系统的专利,Linux系统中也可以使用,不过要安装,默认没有。在CentOS中安装nslookup命令:$sudoyuminstallbind-utils这个bind-utils包,就包含了nslookup命令。Ubuntu系统应该也是一样的,还没有测试过。nslookup是一个能够查询互联网域名服务器信息的程序。他有两种工作模式,即“交互模式”和“…

    2022年10月19日
    2
  • docker离线安装并导入镜像「建议收藏」

    docker离线安装并导入镜像「建议收藏」实际项目开发过程中,客户环境大多是全内网环境,无法连接互联网。这样docker就不能yum在线联网安装,所需要的镜像也不能在线pull下载。这时就需要进行离线安装docker及镜像。

    2022年9月26日
    3
  • 4g通信系统的网络结构_4g通信

    4g通信系统的网络结构_4g通信1、4G通信网络的关键技术研究4G通信网络,就必须加强对其关键技术的研究,这是决定4G网络通信与3G网络通信不同的关键因素,其主要包括正交频分复用技术、软件无线电技术、智能天线技术、多输入多输出技术、IP核心网技术和多用户检测技术等。1.1正交频分复用技术所谓的正交频分复用技术,简称OFDM技术,是4G通信网络的核心技术,主要是将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。OFDM技术不同于一般性的网络技术,它可以通过相关技术将信号分开,有

    2022年9月15日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号