XStream常用功能应用

一. XStream官网

 http://x-stream.github.io

二. XStream介绍

XStream在运行时使用Java反射机制对要进行序列化的对象树的结构进行探索,并不需要对对象作出修改。XStream可以序列化内部字段,包括私private和final字段,并且支持非公开类以及内部类。

在缺省情况下,XStream不需要配置映射关系,对象和字段将映射为同名XML元素。但是当对象和字段名与XML中的元素名不同时,XStream支持指定别名。XStream支持以方法调用的方式,或是Java 标注的方式指定别名。

XStream在进行数据类型转换时,使用系统缺省的类型转换器。同时,也支持用户自定义的类型转换器。

三. XStream的简单使用

  1. 添加XStream依赖
<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.12</version>
</dependency>
 <dependency>
    <groupId>org.codehaus.jettison</groupId>
    <artifactId>jettison</artifactId>
    <version>1.4.1</version>
</dependency>
  1. XStream的简单例子

    XML序列化
    
@Data
class Department {
   private String name;
   private Integer account;
   private String manager;
}
@Slf4j
public class XStreamService {
    @Test
    public void beanToXmlTest(){
        Department department = new Department();
        department.setName("技术部");
        department.setAccount(new Integer("18"));
        department.setManager("艾达");
        XStream xStream = new XStream();
        xStream.processAnnotations(Department.class);
        String xml = xStream.toXML(department);
        log.info("序列化:\n{}", xml);

        Department department1 = (Department)xStream.fromXML(xml);
        log.info("反序列化:\n{}", department1);
    }
}
//执行结果
XML序列化:
<Department>
  <name>技术部</name>
  <account>18</account>
  <manager>艾达</manager>
</Department>

XML反序列化:
Department(name=技术部, account=18, manager=艾达)
Json序列化
@Data
class Department {
     private String name;
     private Integer account;
     private String manager;
 }
@Slf4j
public class XStreamService {
    @Test
    public void beanToJsonString(){
        Department department = new Department();
        department.setName("技术部");
        department.setAccount(new Integer("18"));
        department.setManager("艾达");
        XStream xStream = new XStream(new JettisonMappedXmlDriver());
        xStream.setMode(XStream.NO_REFERENCES);
        String json = xStream.toXML(department);
        log.info("Json序列化:\n{}", json);

        Department department1 = (Department)xStream.fromXML(json);
        log.info("Json反序列化:\n{}", department1);
    }
}
//执行结果
Json序列化:
{"com.dayday.up.store.service.biz.bo.Department":{"name":"技术部","account":18,"manager":"艾达"}}

Json反序列化:
Department(name=技术部, account=18, manager=艾达)

三. XStream的基础使用

(一)节点重命名

  1. XStram 的 alias()、aliasField() 方法的简单使用
    说明:
    (1)alias(String name, Class type)是用来给父节点重命名
    (2)aliasField(String alias, Class definedIn, String fieldName)是用来给子节点重命名
@Data
public class Department {
    private String name;
    private Integer account;
    private String manager;
}
@Slf4j
public class XStreamService {
   @Test
    public void beanToXml(){
        Department department = new Department2();
        department.setName("技术部");
        department.setAccount(new Integer("19"));
        department.setManager("艾迪");
        XStream xStream = new XStream();
        xStream.processAnnotations(Department.class);
        xStream.alias("DEPARTMENT", Department.class);
        xStream.aliasField("NAME", Department.class,"name");
        xStream.aliasField("ACCOUNT", Department.class,"account");
        xStream.aliasField("MANAGE", Department.class,"manager");
        String xml = xStream.toXML(department);
        log.info("XML序列化:\n{}", xml);
    }
}
//运行结果
XML序列化:
<DEPARTMENT>
  <NAME>技术部</NAME>
  <ACCOUNT>19</ACCOUNT>
  <MANAGE>艾迪</MANAGE>
</DEPARTMENT>
  1. @XStreamAlias的简单使用
    说明: @XStreamAlias注解的使用,该注解主要是用来重命名每个节点名称,功能等于XStream中的方法alias()、aliasField()
@Data
@XStreamAlias(value = "department")
public class Department {
    @XStreamAlias(value = "name")
    private String name;
    @XStreamAlias(value = "account")
    private Integer account;
    @XStreamAlias(value = "manager")
    private String manager;
}
@Slf4j
public class XStreamService {
    @Test
    public void beanToXmlTest(){
        Department department = new Department();
        department.setName("技术部");
        department.setAccount(new Integer("19"));
        department.setManager("艾迪");
        XStream xStream = new XStream();
        xStream.processAnnotations(Department.class);
        String xml = xStream.toXML(department);
        log.info("XML序列化:\n{}", xml);
    }
}
//运行结果
XML序列化:
<department>
  <name>技术部</name>
  <account>18</account>
  <manager>艾达</manager>
</department>

(二)为节点设置属性

  1. 使用useAttributeFor()方法
 @Data
@XStreamAlias(value = "department")
public class Department {
    @XStreamAlias(value = "company")
    private String company;
    @XStreamAlias(value = "name")
    private String name;
    @XStreamAlias(value = "account")
    private Integer account;
    @XStreamAlias(value = "manager")
    private String manager;
}
@Slf4j
public class XStreamService {
    @Test
    public void beanAndXml(){
        Department department = new Department();
        department.setName("技术部");
        department.setAccount(new Integer("21"));
        department.setManager("艾迪");
        department.setCompany("广州唯品会");

        XStream xStream = new XStream();
        xStream.processAnnotations(Department.class);
        xStream.useAttributeFor(Department.class,"company");
        String xml = xStream.toXML(department);
        log.info("XML序列化:\n{}", xml);
    }
}
XML序列化:
<department company="广州唯品会">
  <name>技术部</name>
  <account>22</account>
  <manager>艾迪</manager>
</department>
  1. 使用@XStreamAsAttribute注解
@Data
@XStreamAlias(value = "department")
public class Department {
    @XStreamAsAttribute
    @XStreamAlias(value = "company")
    private String company;
    @XStreamAlias(value = "name")
    private String name;
    @XStreamAlias(value = "account")
    private Integer account;
    @XStreamAlias(value = "manager")
    private String manager;
}

@Slf4j
public class XStreamService{
    @Test
    public void beanAndXml(){
        Department department = new Department();
        department.setName("技术部");
        department.setAccount(new Integer("22"));
        department.setManager("艾迪");
        department.setCompany("广州唯品会");

        XStream xStream = new XStream();
        xStream.processAnnotations(Department.class);
        String xml = xStream.toXML(department);
        log.info("XML序列化:\n{}", xml);
    }
}
XML序列化:
<department company="广州唯品会">
  <name>技术部</name>
  <account>22</account>
  <manager>艾迪</manager>
</department>

(三)忽略集合根节点

  1. 使用addImplicitCollection() 方法忽略集合根节点
@Data
@XStreamAlias(value = "department")
public class Department {
    @XStreamAsAttribute
    @XStreamAlias(value = "company")
    private String company;
    @XStreamAlias(value = "name")
    private String name;
    @XStreamAlias(value = "account")
    private Integer account;
    @XStreamAlias(value = "manager")
    private String manager;
    @XStreamAlias(value = "employeeList")
    private List<Employee> employeeList;
}
@Data
@XStreamAlias("employee")
public class Employee {
    @XStreamAlias("name")
    private String name;
    @XStreamAlias("position")
    private String position;
    public Employee(String name, String position) {
        this.name = name;
        this.position = position;
    }
}
@Slf4j
public class XStreamService {
    @Test
    public void beanAndXml(){
        Department department = new Department();
        department.setName("技术部");
        department.setAccount(new Integer("22"));
        department.setManager("艾迪");
        department.setCompany("广州唯品会");

        Employee employee = new Employee("张三","开发");
        Employee employee1 = new Employee("李四","测试");
        List<Employee> employeeList = new ArrayList<>();
        employeeList.add(employee);
        employeeList.add(employee1);
        department.setEmployeeList(employeeList);
        XStream xStream = new XStream();
        xStream.processAnnotations(Department.class);
        xStream.addImplicitCollection(Department.class,"employeeList");
        String xml = xStream.toXML(department);
        log.info("XML序列化:\n{}", xml);
    }
}
//执行结果,没有生成节点employeeList
XML序列化:
<department company="广州唯品会">
  <name>技术部</name>
  <account>22</account>
  <manager>艾迪</manager>
  <employee>
    <name>张三</name>
    <position>开发</position>
  </employee>
  <employee>
    <name>李四</name>
    <position>测试</position>
  </employee>
</department>
  1. 用@XStreamImplicit注解忽略集合根节点
@Data
@XStreamAlias(value = "department")
public class Department {
    @XStreamAsAttribute
    @XStreamAlias(value = "company")
    private String company;
    @XStreamAlias(value = "name")
    private String name;
    @XStreamAlias(value = "account")
    private Integer account;
    @XStreamAlias(value = "manager")
    private String manager;
    @XStreamAlias(value = "employeeList")
    @XStreamImplicit
    private List<Employee> employeeList;
}
@Data
@XStreamAlias("employee")
public class Employee {
    @XStreamAlias("name")
    private String name;
    @XStreamAlias("position")
    private String position;
    public Employee(String name, String position) {
        this.name = name;
        this.position = position;
    }
}
@Slf4j
public class XStreamService {
    @Test
    public void beanAndXml(){
        Department department = new Department();
        department.setName("技术部");
        department.setAccount(new Integer("22"));
        department.setManager("艾迪");
        department.setCompany("广州唯品会");

        Employee employee = new Employee("张三","开发");
        Employee employee1 = new Employee("李四","测试");
        List<Employee> employeeList = new ArrayList<>();
        employeeList.add(employee);
        employeeList.add(employee1);
        department.setEmployeeList(employeeList);
        XStream xStream = new XStream();
        xStream.processAnnotations(Department.class);
        String xml = xStream.toXML(department);
        log.info("XML序列化:\n{}", xml);
    }
}
//执行结果,没有生成节点employeeList
XML序列化:
<department company="广州唯品会">
  <name>技术部</name>
  <account>22</account>
  <manager>艾迪</manager>
  <employee>
    <name>张三</name>
    <position>开发</position>
  </employee>
  <employee>
    <name>李四</name>
    <position>测试</position>
  </employee>
</department>

(四)隐藏某个节点

  1. 使用omitField() 方法隐藏
@Data
@XStreamAlias(value = "department")
public class Department {
    @XStreamAsAttribute
    @XStreamAlias(value = "company")
    private String company;
    @XStreamAlias(value = "name")
    private String name;
    @XStreamAlias(value = "account")
    private Integer account;
    @XStreamAlias(value = "manager")
    private String manager;
}
@Slf4j
public class XStreamService {
    @Test
    public void beanAndXml(){
        Department department = new Department();
        department.setName("技术部");
        department.setAccount(new Integer("26"));
        department.setManager("艾迪");
        department.setCompany("广州唯品会");

        XStream xStream = new XStream();
        xStream.processAnnotations(Department.class);
        xStream.omitField(Department.class, "account");
        String xml = xStream.toXML(department);
        log.info("XML序列化:\n{}", xml);
    }
}
//执行结果,没有生成account节点
XML序列化:
<department company="广州唯品会">
  <name>技术部</name>
  <manager>艾迪</manager>
</department>
  1. 使用@XStreamOmitField注解隐藏
@Data
@XStreamAlias(value = "department")
public class Department {
    @XStreamAsAttribute
    @XStreamAlias(value = "company")
    private String company;
    @XStreamAlias(value = "name")
    private String name;
    @XStreamAlias(value = "account")
    @XStreamOmitField
    private Integer account;
    @XStreamAlias(value = "manager")
    private String manager;
}
@Slf4j
public class XStreamService {
    @Test
    public void beanAndXml(){
        Department department = new Department();
        department.setName("技术部");
        department.setAccount(new Integer("26"));
        department.setManager("艾迪");
        department.setCompany("广州唯品会");

        XStream xStream = new XStream();
        xStream.processAnnotations(Department.class);
        String xml = xStream.toXML(department);
        log.info("XML序列化:\n{}", xml);
    }
}
//执行结果,没有生成account节点
XML序列化:
<department company="广州唯品会">
  <name>技术部</name>
  <manager>艾迪</manager>
</department>
链接:

https://www.yiibai.com/xstream
https://www.cnblogs.com/LiZhiW/p/4313493.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值