`
mj4d
  • 浏览: 301911 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

XStream

    博客分类:
  • java
阅读更多

XStream是一个将对象序列化为xml并解析xml为对象的框架,主页位于http://xstream.codehaus.org。使用非常简单

 

引入依赖:

<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.2</version>
</dependency>

需要的依赖

XmlPull一个xmlpull parser api用来判断具体的xml解析实现(DOM、StAX等)工厂

其他可供选择的Xpp3DOM4J

 

1、创建待序列化的对象:

Person.java

public class Person {

    private Integer id;
    private String  username;
    private String  password;
    private Address address;
    ...
}

 Person中包含一个Address作为Field

public class Address {

    private String street;
    private String city;
    ......
}

 

2、序列化和反序列化

使用XStream只需要实例化一个XStream对象即可:

XStream xstream = new XStream();
//采用这个构造器默认需要依赖:xstream-[version].jar, xpp3-[version].jar and xmlpull-[version].jar
 或者采用DOM的方式解析:
XStream xstream = new XStream(new DomDriver()); 
//此时不需要XPP3

或者基于事件的StAX

XStream xstream = new XStream(new StaxDriver()); 
//如果采用Java 6,也不需要xpp3.将采用默认的JAXB
//对象序列化为xml
xstream.toXML(Object)

//xml反序列化为对象
xstream.fromXML(xml)

 一个例子:

Person p = new Person();
p.setId(1);
p.setUsername("robin");
p.setPassword("123");
p.setAddress(new Address("xxRoad", "chengdu"));
xstream.toXML(p);

 输出为:

<org.java.codelib.xstream.Person>
  <id>1</id>
  <username>robin</username>
  <password>123</password>
  <address>
    <street>xxRoad</street>
    <city>chengdu</city>
  </address>
</org.java.codelib.xstream.Person>

 

3、alias

这里可以看到生成的xml中root element名字为class,如果需要修改就需要用到

xstream.alias("person", Person.class);

这样就会用person替代org.java.codelib.xstream.Person

同样对于field也可以使用alias:

xstream.aliasField("personId", Person.class, "id");

这样就会将Person中的id替换为<personId>1</personId>

其他的还有aliasAttribute即将field作为attribute时并采用别名,当前前提是需要设置field作为attribute:

XStream xstream = new XStream(new StaxDriver());
xstream.alias("person", Person.class);
xstream.useAttributeFor(Person.class, "id");
xstream.aliasAttribute("personId", "id");
xstream.toXML(p);

输出为:

<?xml version="1.0" ?><person personId="1"><username>robin</username><password>123</password><address><street>xxRoad</street><city>chengdu</city></address></person> 

说到设置field作为attribute如果field是一个自定义对象,或者需要将Date之类的属性格式化输出,如本例中的Address该如何处理?这就是另外一个话题

需要说明的是以上在序列化为xml的时候使用了alias,那么在反序列化的时候同样需要这些相应的代码,不然可能会抛出UnknownFieldException

 

4、convertors

convertor的作用是在做序列化或反序列化的时候,将对象中的属性按照特定的形式输出或转化,在XStream 中默认初始化了大量的必要convertors,见http://xstream.codehaus.org/converters.html 或者在XStream.java中有方法setupConverters()。

自定义一个convertor需要两步:

1、实现Converter接口及相关方法:

public class DateConverter implements Converter {

    @Override
    public boolean canConvert(Class type) {
        return type.equals(Date.class);
    }

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        writer.setValue(dateFormat.format((Date) source));
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return dateFormat.parse(reader.getValue());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

}

 

2、在xstream中注册该convertor:

xstream.registerConverter(new DateConverter());

 输出

<?xml version="1.0" ?><person><id>1</id><username>robin</username><password>123</password><birthday>2013-02-17 15:12:53</birthday><address><street>xxRoad</street><city>chengdu</city></address></person>

当然,xstream针对Date也做了默认的实现,只不过默认输出为UTC格式

现在我们回到上面的问题,即将对象Address作为Person的属性,下面是一个convertor的实现:

public class PersonConverter implements Converter {

    @SuppressWarnings("rawtypes")
    @Override
    public boolean canConvert(Class type) {
        return type.equals(Person.class);
    }

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        Person person = (Person) source;
        if (person != null) {
            Address address = person.getAddress();
            if (address != null) {
                if (StringUtils.isNotBlank(address.getStreet())) {
                    writer.addAttribute("street", address.getStreet());
                }
                if (StringUtils.isNotBlank(address.getCity())) {
                    writer.addAttribute("city", address.getCity());
                }
            }

            //address
            if (person.getBirthday() != null) {
                writer.startNode("birthday");
                context.convertAnother(person.getBirthday(), new DateConverter());
                writer.endNode();
            }

            //username
            if (person.getUsername() != null) {
                writer.startNode("username");
                context.convertAnother(person.getUsername());
                writer.endNode();
            }
            //other fields
        }
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        Person p = new Person();
        Address address = new Address();
        address.setCity(reader.getAttribute("city"));
        address.setStreet(reader.getAttribute("street"));
        p.setAddress(address);

        while (reader.hasMoreChildren()) {
            reader.moveDown();
            if ("birthday".equals(reader.getNodeName())) {
                Date date = (Date) context.convertAnother(p, Date.class, new DateConverter());
                p.setBirthday(date);
            } else if ("username".equals(reader.getNodeName())) {
                p.setUsername((String) context.convertAnother(p, String.class));
            }
            //other fields
            reader.moveUp();
        }

        return p;
    }
}

其中序列化时输出:

 <?xml version="1.0" ?><person street="xxRoad" city="chengdu"><birthday>2013-02-17 16:34:24</birthday><username>robin</username></person>

当然如果作为fields的对象只有一个属性就简单得多了,在http://xstream.codehaus.org/alias-tutorial.html#attributes有例子可供参考

 

5、implicitCollections
考虑Person有列表属性:

private List<Address> addresses;

 在序列化为xml时:

<?xml version="1.0" ?><person><addresses><address><street>road_1</street><city>chengdu</city></address><address><street>road_2</street><city>chengdu</city></address></addresses></person>

 当然有时候并不想要addresses,这就是XStream中的implicitCollections:对集合的属性在序列化是不想显示roottag。值需要很简单的处理:

        XStream xstream = new XStream(new StaxDriver());
        xstream.alias("person", Person.class);
        xstream.alias("address", Address.class);
        xstream.addImplicitCollection(Person.class, "addresses");
        return xstream.toXML(formatPerson());

 输出为: 

<?xml version="1.0" ?><person><address><street>road_1</street><city>chengdu</city></address><address><street>road_2</street><city>chengdu</city></address></person>

 

6、annotation
以上说的内容都支持annotation:

@XStreamAlias("person")
public class Person {

    @XStreamAlias("personId")
    @XStreamAsAttribute
    private Integer       id;
    private String        username;
    private String        password;
    @XStreamConverter(DateConverter.class)
    private Date          birthday;
    private Address       address;
    @XStreamImplicit(itemFieldName = "address")
    private List<Address> addresses;
}
@XStreamAlias("person")
public class Address {

    @XStreamAsAttribute
    private String street;
    @XStreamAsAttribute
    private String city;
}

需要加上autodetectAnnotations(true)

XStream xstream = new XStream(new StaxDriver());
xstream.autodetectAnnotations(true);
return xstream.toXML(p);

输出:

<?xml version="1.0" ?><person personId="1"><username>robin</username><password>123</password><birthday>2013-02-17 17:08:00</birthday><address street="road_1" city="chengdu"></address><address street="road_2" city="chengdu"></address></person>

7、其他

xstream提供了对json的解析以及持久化(文件系统)的支持,这里就不再介绍了

 

 

分享到:
评论

相关推荐

    xstream-1.4.15.jar

    XStream 反序列化漏洞(CVE-2020-26258 & 26259),修复jar包 xstream-1.4.15.jar Xstream 是 Java 类库,用来将对象序列化成 XML (JSON) 或反序列化为对象。XStream 是一款开源软件,允许在 BSD 许可证的许可下分发...

    xstream-1.4.11-API文档-中文版.zip

    赠送jar包:xstream-1.4.11.jar; 赠送原API文档:xstream-1.4.11-javadoc.jar; 赠送源代码:xstream-1.4.11-sources.jar; 赠送Maven依赖信息文件:xstream-1.4.11.pom; 包含翻译后的API文档:xstream-1.4.11-...

    xstream-1.4.2.jar

    《XStream详解与应用》 XStream是一款强大的Java库,用于将对象序列化为XML,同时也能从XML数据中反序列化回对象。在标题"xstream-1.4.2.jar"中,我们看到的是XStream的一个特定版本——1.4.2。这个版本包含了...

    最齐全的xstream1.4.8.jar

    最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar ...

    com.thoughtworks.xstream.XStream操作XML和java对象的一些用法

    XStream库提供了一个简单、直观的方式来实现这种转换,使得XML序列化和反序列化变得非常方便。本篇将详细介绍XStream如何处理XML与Java对象的相互转换,以及如何处理List、Map等集合类型的数据。 首先,XStream是一...

    xstream-1.4.8最齐全的jar包

    XStream是一款强大的Java库,主要用于将Java对象序列化为XML,以及将XML反序列化回Java对象。在Java开发中,这种能力对于数据持久化、网络传输或配置存储等场景非常有用。标题中的"xstream-1.4.8最齐全的jar包"表明...

    springMVC整合xStream实现对象和xml转换

    XStream则是一个Java库,用于将Java对象序列化为XML,以及将XML反序列化回Java对象。这个过程在处理数据交换或持久化时非常有用,尤其是在Web服务和API中。当我们需要在SpringMVC中返回XML响应时,可以结合使用...

    xstream-1.4.8的jar包、源码、说明文档.zip

    XStream 是一个强大的 Java 库,它允许程序员将 Java 对象序列化为 XML,反之亦然。这个压缩包“xstream-1.4.8的jar包、源码、说明文档.zip”包含了 XStream 的核心组件,使得用户可以深入了解其工作原理并进行定制...

    xml解析及使用XStream实现javaBean与xml之间的转换

    - 创建XStream实例:`XStream xstream = new XStream();` - 配置XStream:可设置命名空间、类型别名、日期格式等,如`xstream.alias("user", User.class);` - 将JavaBean转换为XML:`String xml = xstream.toXML...

    xstream.jar及其他依赖jar包

    "xstream.jar及其他依赖jar包"是解决这一问题的重要工具,它包括了xstream-1.4.10.jar、xpp3-1.1.4c.jar和xmlpull_1_0_5.jar这三个文件。这些jar包提供了全面的Java对象到XML以及XML到Java对象的转换功能,简化了...

    Oracle Database XStream Guide 11g Release 2 (11.2)-302

    Oracle Database XStream Guide 11g Release 2 (11.2)-302 Oracle Database XStream 是 Oracle 公司推出的一个数据捕获和事件处理工具,旨在帮助用户实时捕获和处理数据库中的数据变化。下面是 Oracle Database ...

    xstream相关的jar包

    XStream是一款强大的Java库,用于将Java对象序列化为XML,反之亦然。这个库的主要优点在于其简单易用的API和对复杂对象图的处理能力。在标题中提到的"Xstream相关的jar包",是指为了使用XStream库,需要引入的依赖...

    Java用xStream拼接xml

    当需要将数据转换为XML格式以便于传输或处理时,工具如xStream就显得尤为重要。Java中的xStream库提供了一个简单易用的方式来将Java对象序列化为XML,反之亦然,即反序列化XML回Java对象。 **xStream简介** xStream...

    XStream 1.4.11 jar包

    **XStream 1.4.11 jar包详解** XStream 是一个强大的 Java 库,它提供了一种简单且高效的方式来序列化和反序列化 Java 对象为 XML,反之亦然。这个工具库的设计目标是使得 XML 和 Java 对象之间的转换变得极其简单...

    XStream的Date转换 @XStreamConverter DateConverter

    在Java开发中,数据序列化和反序列化是常见的需求,XStream库提供了一个方便的解决方案。XStream是一个用于XML、JSON和HTML的Java库,它能够将Java对象转化为XML,反之也能将XML数据还原为Java对象。在这个场景中,...

    xstream解析依赖包

    《XStream解析依赖包详解》 在Java开发中,数据序列化是一个不可或缺的环节,它使得对象的状态可以被保存和恢复。XStream是一款强大的Java库,用于将Java对象转换为XML,反之亦然,极大地简化了序列化和反序列化的...

    xStream完整Jar包

    **XStream 概述** XStream 是一个 Java 库,用于将对象序列化为 XML,以及从 XML 反序列化回对象。它提供了一种简单而直观的方式来处理 XML 数据,使得 XML 文档与 Java 对象之间的转换变得轻而易举。这个“xStream...

    xstream-1.3.1.zip

    《XStream 1.3.1:Java对象到XML的高效转换工具》 XStream是一款强大的Java库,它能够将Java对象序列化为XML,并能从XML反序列化回Java对象。这个“xstream-1.3.1.zip”文件包含了一个名为“xstream-1.3.1.jar”的...

    xstream最新版 - xstream-1.4.18.jar

    xstream最新版jar包

    XStream解析XML实例

    **XStream解析XML实例** 在Java开发中,处理XML数据是一项常见的任务,XStream库提供了一个简单而强大的方式来将Java对象序列化为XML,以及从XML反序列化回Java对象。这个实例将深入探讨如何使用XStream进行XML操作...

Global site tag (gtag.js) - Google Analytics