XStream 简介

XStream 简介XStream 一 概述 XStream 是 Java 类库 用来将对象序列化成 XML JSON 或反序列化为对象 也就是说 使用 XStream 我们可以把 Java 对象转换成 XML 也可以将 XML 转换为 Java 对象 二 XStream 相关 jar 包 XStream 的必导 JAR 包 核心 JAR 包 xstream 1 4 7 jar 必须依赖包 xpp3 min 1 1 4c jar XMLPul

XStream

一、概述

XStream是Java类库,用来将对象序列化成XML (JSON)或反序列化为对象。

也就是说,使用XStream,我们可以把Java对象转换成XML,也可以将XML转换为Java对象。

二、XStream相关jar包

XStream的必导JAR包:

  • 核心JAR包:xstream-1.4.7.jar
  • 必须依赖包:xpp3_min-1.1.4c.jar(XML Pull Parser,一款速度很快的XML解析器)。

三、创建两个类

package com.veeja.demo; public class City { 
    private String name;// 市名 private String description;// 描述 public String getName() { 
    return name; } public void setName(String name) { 
    this.name = name; } public String getDescription() { 
    return description; } public void setDescription(String description) { 
    this.description = description; } public String toString() { 
    return "City [name=" + name + ", description=" + description + "]"; } public City() { 
    super(); // TODO Auto-generated constructor stub } public City(String name, String description) { 
    super(); this.name = name; this.description = description; } } 

另一个是Province类

package com.veeja.demo; import java.util.ArrayList; import java.util.List; public class Province { 
    private String name;// 省名 private List<City> cities = new ArrayList<City>(); public String getName() { 
    return name; } public void setName(String name) { 
    this.name = name; } public List<City> getCities() { 
    return cities; } public void setCities(List<City> cities) { 
    this.cities = cities; } public void addCity(City city) { 
    cities.add(city); } } 

四、简单的示例

使用XStream,步骤也很简单。

第一步就是创建XStream对象。

XStream xStream = new XStream(); 

然后就是使用toXML方法来转换成xml格式的字符串。

String string = xStream.toXML(proList); 
@Test public void function1() { 
    List<Province> proList = getProvinceList(); /* * 创建XStream对象,调用toXML把集合转换成xml字符串 */ XStream xStream = new XStream(); String string = xStream.toXML(proList); System.out.println(string); } public List<Province> getProvinceList() { 
    Province p1 = new Province(); p1.setName("北京"); p1.addCity(new City("东城区", "dongchengqu")); p1.addCity(new City("昌平区", "changpingqu")); Province p2 = new Province(); p1.setName("山东省"); p1.addCity(new City("济南", "jinan")); p1.addCity(new City("青岛", "qingdao")); ArrayList<Province> provinceList = new ArrayList<Province>(); provinceList.add(p1); provinceList.add(p2); return provinceList; } 

结果:

 
   
    
    
      北京 
     
     
      
      
        东城区 
       
      
        dongchengqu 
       
      
      
      
        昌平区 
       
      
        changpingqu 
       
      
     
    
    
    
      山东省 
     
     
      
      
        济南 
       
      
        jinan 
       
      
      
      
        青岛 
       
      
        qingdao 
       
      
     
    
   

我们可以观察一下这个结果:

  • 我们可以明显的看出来,这是一个XML格式的文本。
  • 根元素是 因为我们是把List对象转换为xml,所以根元素为
  • 第二级为
    ,因为我们Javabean的类型为Province,所以元素的名称就是类的完整名
  • 第三级为

    ,就是Province类内的属性名。
  • 。。。
  • 。。。

五、别名

我们在上面生成的xml中,发现了几个问题:

  1. 根元素是 ,根据我们的需求,其实这个根元素如果是
    更合适一点。
  2. 还有中间的
    ,都太长了,而且还有类的包名,这里可以简要一些,换成小写,也就是 就可以了。

这个问题怎么解决呢?答案是使用“别名(alias)”。

我们有这么几个需求:
默认List类型对应 元素,希望让List类型对应
元素;
默认Province类型对应
,希望让它对应
默认City类型对应
,希望它对应
元素。






我们可以使用xstream.alias("aaa",Bbb.class);用来将Bbb类指定别名为aaa

例如,我们改写上面的代码为:

@Test public void function2() { 
    List<Province> proList = getProvinceList(); /* * 创建XStream对象,调用toXML把集合转换成xml字符串 */ XStream xStream = new XStream(); xStream.alias("china", List.class); xStream.alias("province", Province.class); xStream.alias("city", City.class); String string = xStream.toXML(proList); System.out.println(string); } 

我们再看一下结果,已经变成我们想要的样子了:

 
   
    
    
      北京 
     
     
      
      
        东城区 
       
      
        dongchengqu 
       
      
      
      
        昌平区 
       
      
        changpingqu 
       
      
     
    
    
    
      山东省 
     
     
      
      
        济南 
       
      
        jinan 
       
      
      
      
        青岛 
       
      
        qingdao 
       
      
     
    
   

六、指定属性、去除无用Collection类的属性

我们现在不妨把山东省的那一部分单独拿出来看一看:

<province> <name>山东省 
     name> <cities> <city> <name>济南 
      name> <description>jinan 
       description>  
        city> <city> <name>青岛 
         name> <description>qingdao 
          description>  
           city>  
            cities>  
             province> 
<province name="山东省"> <city> <name>济南 
     name> <description>jinan 
      description>  
       city> <city> <name>青岛 
        name> <description>qingdao 
         description>  
          city>  
           province> 

这样就会简洁的多。

也就是说,默认情况下,Javabean的属性都会生成子元素,但是我们希望生成为元素的属性。
这时我们可以使用xstream.useAttributeFor(Ccc.class, "name");来将Ccc类的name属性,生成
的属性。
我们还可以使用xStream.addImplicitCollection(Province.class, "cities");来去除Province类的cities(Collection类型的)属性。




也就是我们再次改写上面的代码:

@Test public void function2() { 
    List<Province> proList = getProvinceList(); /* * 创建XStream对象,调用toXML把集合转换成xml字符串 */ XStream xStream = new XStream(); xStream.alias("china", List.class); xStream.alias("province", Province.class); xStream.alias("city", City.class); xStream.useAttributeFor(Province.class, "name"); xStream.addImplicitCollection(Province.class, "cities"); String string = xStream.toXML(proList); System.out.println(string); } 

我们看一下输出的结果:

 
   
    
     
     
       东城区 
      
     
       dongchengqu 
      
     
     
     
       昌平区 
      
     
       changpingqu 
      
     
    
    
     
     
       济南 
      
     
       jinan 
      
     
     
     
       青岛 
      
     
       qingdao 
      
     
    
   

七、去除不想要的Javabean属性

我们又发现了一个问题,这个
属性好像没什么用处。这个属性能不能去掉呢?
这个时候,我们可以使用xStream.omitField(City.class, "description");来去除。

改写代码:

@Test public void function2() { 
    List<Province> proList = getProvinceList(); /* * 创建XStream对象,调用toXML把集合转换成xml字符串 */ XStream xStream = new XStream(); xStream.alias("china", List.class); xStream.alias("province", Province.class); xStream.alias("city", City.class); xStream.useAttributeFor(Province.class, "name"); xStream.addImplicitCollection(Province.class, "cities"); // 让city类,名为description的属性不生成对应的xml属性 xStream.omitField(City.class, "description"); String string = xStream.toXML(proList); System.out.println(string); } 

输出结果:

 
   
    
     
     
       东城区 
      
     
     
     
       昌平区 
      
     
    
    
     
     
       济南 
      
     
     
     
       青岛 
      
     
    
   

END.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2026年3月18日 下午11:45
下一篇 2026年3月18日 下午11:45


相关推荐

  • nginx 配置多个server与多个location

    nginx 配置多个server与多个location配置多个 Server 主要针对于不同端口号访问多个项目 server listen80 如 www baidu com 一般二级域名 server namexxx xxx xxx 80 端口下的所有路径都代理到这 location 访问路径 相对路径 roothtml main 首页 indexindex html

    2026年3月17日
    3
  • 关于静态方法与非静态方法的执行效率

    关于静态方法与非静态方法的执行效率以前看到许多网友认为静态方法要比实例方法在执行效率上要快一些 当初不敢苟同 自己亲自试了一把 发现静态方法确实要快一些 想要比较静态方法与非静态方法的执行效率 需要对 CLR 在调用静态方法与非静态方法时的不同之处要有一个了解 静态方法是与类相关联的 CLR 在调用一个静态方法时需要做的事情就是找到定义该方法的类型即可实现调用 而在调用非静态方法时 为了保证运行安全 CLR 会对我们的源代码进行

    2026年1月23日
    2
  • matlab 读txt数据_数据库文件的读取

    matlab 读txt数据_数据库文件的读取fid=fopen(‘hello.txt’,’w’);%需要改文件名称的地方fprintf(fid,’%f\n’,data);%data:需要导出的数据名称fclose(fid);…

    2025年9月22日
    8
  • c#实现图片gif去水印「建议收藏」

    做项目时候会遇到在网络上爬的源文件,png图片或者动画gif背景都带有水印,“百度出品”“不得转载”等等,这样出来的文件放在项目里面当做自己的资源来用肯定是不可以的,现在就来用lockbits替换背景的颜色,实现水印消除的目的。话不多述,上图:处理前:这是处理之前的图,其实底部的“baidu汉语“看着并不是很明显(仔细看),仍然需要把字体的背部水印去掉,这里开始用lockbits来去水印了。处理

    2022年4月9日
    138
  • Redis之skiplist

    Redis之skiplistRedis 为什么用跳表而不用平衡树 本文是 Redis 内部数据结构详解 系列的第六篇 在本文中 我们围绕一个 Redis 的内部数据结构 skiplist 展开讨论 Redis 里面使用 skiplist 是为了实现 sortedset 这种对外的数据结构 sortedset 提供的操作非常丰富 可以满足非常多的应用场景 这也意味着 sortedset 相对来说实现比较复杂 同时 skiplist 这种数据结构

    2026年3月26日
    2
  • pycharm debug 单步调试太卡太慢解决方案

    pycharm debug 单步调试太卡太慢解决方案改关的关选项含义解释 Debugger DataViews PyCharmhttps www jetbrains com help pycharm settings debugger data views html

    2025年9月20日
    6

发表回复

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

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