`

XStream别名指南

阅读更多

1,存在的问题
设想我们的客户端定义了一个用于XStream读写的XML文件:
我们将设计一些模型类并配置XStream按照这个XML文件格式执行读写操作。

<blog author="Guilherme Silveira"> 
  <entry> 
    <title>first</title> 
    <description>My first blog entry.</description> 
  </entry> 
  <entry> 
    <title>tutorial</title> 
    <description> 
        Today we have developed a nice alias tutorial. Tell your friends! NOW! 
    </description> 
  </entry> 
</blog>

2,模型:
首先,建立一个简单的Blog对象:

package com.thoughtworks.xstream;  
public class Blog { 
        private Author author; 
        private List entries = new ArrayList();  
        public Blog(Author author) { 
                this.author = author; 
        }  
        public void add(Entry entry) { 
                entries.add(entry); 
        }  
        public List getContent() { 
                return entries; 
        } 
}


然后是一个带有名字的作者对象:

package com.thoughtworks.xstream;  
public class Author { 
        private String name; 
        public Author(String name) { 
                this.name = name; 
        } 
        public String getName() { 
                return name; 
        } 
}

具体的blog内容对象:

package com.thoughtworks.xstream;  
public class Entry { 
        private String title, description; 
        public Entry(String title, String description) { 
                this.title = title; 
                this.description = description; 
        } 
}


虽然我们没有创建getters/setters方法,但这并不影响XStream对XML->Object文件的解析。
3,简单的测试
首先初始化一个blog实例,然后使用XStream来序列化

public static void main(String[] args) {  
        Blog teamBlog = new Blog(new Author("Guilherme Silveira")); 
        teamBlog.add(new Entry("first","My first blog entry.")); 
        teamBlog.add(new Entry("tutorial", 
                "Today we have developed a nice alias tutorial. Tell your friends! NOW!")); 
        XStream xstream = new XStream(); 
        System.out.println(xstream.toXML(teamBlog)); 
}


由该Blog实例解析出的XML文件为: 

<com.thoughtworks.xstream.Blog> 
  <author> 
    <name>Guilherme Silveira</name> 
  </author> 
  <entries> 
    <com.thoughtworks.xstream.Entry> 
      <title>first</title> 
      <description>My first blog entry.</description> 
    </com.thoughtworks.xstream.Entry> 
    <com.thoughtworks.xstream.Entry> 
      <title>tutorial</title> 
      <description> 
        Today we have developed a nice alias tutorial. Tell your friends! NOW! 
      </description> 
    </com.thoughtworks.xstream.Entry> 
  </entries> 
</com.thoughtworks.xstream.Blog>
4,为类取别名
首先我们来改变XStream对com.thoughtworks.xstream.Blog的输出名称。我们只想使用一个简单的blog来取代。下面为Blog类创建一个别名:
Xstream.alias("blog",Blog.class);
同样的,为Entry类创建一个别名:
Xstream.alias("entry",Entry.class);
好,到此输出的XML变为:
<blog> 
  <author> 
    <name>Guilherme Silveira</name> 
  </author> 
  <entries> 
    <entry> 
      <title>first</title> 
      <description>My first blog entry.</description> 
    </entry> 
    <entry> 
      <title>tutorial</title> 
      <description> 
        Today we have developed a nice alias tutorial. Tell your friends! NOW! 
      </description> 
    </entry> 
  </entries> 
</blog>

 
5,去掉entries标记
下面,我们将实施叫做"implicit collection"的过程(即取消标记):所有的集合类型,都不需要显示他的根标签(root tag),你可以直接使用一个implicit collection去映射。
在我们的例子里面,我们不希望出现entries标签,只需要一个接一个的列出所有的entry标签即可。
要做到这点,只需要简单的调用XStream对象上的addImplicitCollection方法,就可以配置XStream取消对entries的输出:
package com.thoughtworks.xstream; 
import java.util.ArrayList; 
import java.util.List; 
public class Test { 
        public static void main(String[] args) { 
                Blog teamBlog = new Blog(new Author("Guilherme Silveira")); 
                teamBlog.add(new Entry("first","My first blog entry.")); 
                teamBlog.add(new Entry("tutorial", 
                        "Today we have developed a nice alias tutorial. Tell your friends! NOW!")); 
                XStream xstream = new XStream(); 
                xstream.alias("blog", Blog.class); 
                xstream.alias("entry", Entry.class); 
                xstream.addImplicitCollection(Blog.class, "entries"); 
                System.out.println(xstream.toXML(teamBlog)); 
        } 
}

注意addImplicitCollection方法的调用,需要描述在某个类上的某个成员变量不需要被显示。
得到的结果基本上达到了要求:
<blog> 
  <author> 
    <name>Guilherme Silveira</name> 
  </author> 
  <entry> 
    <title>first</title> 
    <description>My first blog entry.</description> 
  </entry> 
  <entry> 
    <title>tutorial</title> 
    <description> 
        Today we have developed a nice alias tutorial. Tell your friends! NOW! 
    </description> 
  </entry> 
</blog>

7,为属性添加别名
下一步是要把author成员变量设置为XML的属性。要做到这点,我们需要告诉XStream将author属性作为Blog类的"author"属性。
xstream.useAttributeFor(Blog.class,"author");
现在留给我们一个问题,XStream怎么讲一个Author转换成一个String对象让他在Blog节点中以author属性显示?
只需要使用SimpleValeConverter并且实现我们自己的Author转换器:
class AuthorConverter implements SingleValueConverter {
}
第一个需要实现的方法是告诉XStream该转化器是用来转换什么类型的对象:
        public boolean canConvert(Class type) {
                return type.equals(Author.class);
        }
接下来是将一个Author实例转化成字符串:
public String toString(Object obj) {
                return ((Author) obj).getName();
        }
最后是相反的工作:怎么从一个字符串中得到Author实例
        public Object fromString(String name) {
                return new Author(name);
        }
最后,该转化器看起来是这样:
class AuthorConverter implements SingleValueConverter {
        public String toString(Object obj) {
                return ((Author) obj).getName();
        }
        public Object fromString(String name) {
                return new Author(name);
        }
        public boolean canConvert(Class type) {
                return type.equals(Author.class);
        }
 }
然后将这个转化器注册到XStream:

public class Test { 
        public static void main(String[] args) { 
                Blog teamBlog = new Blog(new Author("Guilherme Silveira")); 
                teamBlog.add(new Entry("first","My first blog entry.")); 
                teamBlog.add(new Entry("tutorial", 
                        "Today we have developed a nice alias tutorial. Tell your friends! NOW!")); 
                XStream xstream = new XStream(); 
                xstream.alias("blog", Blog.class); 
                xstream.alias("entry", Entry.class); 
                xstream.addImplicitCollection(Blog.class, "entries"); 
                xstream.useAttributeFor(Blog.class, "author"); 
                xstream.registerConverter(new AuthorConverter()); 
                System.out.println(xstream.toXML(teamBlog)); 
        } 
}


最后的输出:

<blog author="Guilherme Silveira"> 
  <entry> 
    <title>first</title> 
    <description>My first blog entry.</description> 
  </entry> 
  <entry> 
    <title>tutorial</title> 
    <description> 
        Today we have developed a nice alias tutorial. Tell your friends! NOW! 
    </description> 
  </entry> 
</blog>

在这里,useAttributeFor方法被其他几个相似功能的方法重载,包括一个接受一个额外的字符串(Class , String, String)的版本,该版本告诉XStream将该属性创建为另一个别名,比如在这里,如果使用useAttributeFor(Blog.class , "author", "auth")会将"author"属性在XML中映射成"auth"属性。

  • 大小: 35.2 KB
分享到:
评论

相关推荐

    xStream 开发指南

    xStream 是一个强大的 Java 库,它允许开发者轻松地在 Java 对象和 XML 或 JSON 文档之间进行序列化和反序列化。这个框架的核心优势在于其简单易用的API和高度自定义的能力,使得对象的表示能精确地映射到 XML 或 ...

    解决XStream注解同名冲突

    com.thoughtworks.xstream.converters.ConversionException: No field 'null' found in class '.....(注解的类路径)' ---- Debugging information ---- message : No field 'null' found in class '.....' cause...

    XStream XML与Json转换

    但是当对象和字段名与XML中的元素名不同时,XStream支持指定别名。XStream支持以方法调用的方式,或是Java 标注的方式指定别名。 XStream在进行数据类型转换时,使用系统缺省的类型转换器。同时,也支持用户自定义...

    最齐全的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 ...

    xstream-1.4.15.jar

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

    xstream最新版 - xstream-1.4.18.jar

    xstream最新版jar包

    xstream-1.4.2.jar

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

    xstream-1.4-API

    **XStream 1.4 API 深度解析** XStream 是一个强大的 Java 库,它的主要功能是将 Java 对象序列化为 XML,并能够从 XML 数据中反序列化回原来的对象。这个库的设计目标是提供简单易用的 API,同时保持高性能和安全...

    Java用xStream拼接xml

    // 给Employee类设置别名 ``` 3. **序列化Java对象为XML** 有了配置好的xStream实例,你可以将Java对象转换为XML字符串: ```java Employee employee = new Employee("John", "Doe"); String xml = xstream....

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

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

    XStream 1.3 API 手册

    这个API手册是针对XStream 1.3版本的,包含了详细的使用指南和技术信息,旨在帮助开发者更深入地理解和应用这个强大的工具。 ### XStream 序列化和反序列化 1. **序列化**: XStream 可以将Java对象转换成XML字符串...

    XStream使用文档 wd.docx

    在这个示例中,我们使用 `alias` 方法为类创建别名,这将在生成的 XML 中简化类名。然后,我们创建了一个 `Person` 对象并设置其属性,最后通过 `toXML` 方法将对象转换为 XML 字符串并打印出来。 通过这种方式,你...

    xstream教程资料.rar

    在"XStream+技术指南.docx"中,你将找到丰富的实践示例,涵盖基础操作、复杂类型转换、安全配置等多个方面,帮助你更好地理解并运用XStream。 九、进阶话题 "XStream教程.rar"包含更高级的主题,如处理集合、数组、...

    Xstream生产xml和解析xml

    为了进一步简化映射过程,XStream提供了一系列注解,允许开发者直接在Java类和成员上声明别名和其他映射细节。例如: - `@XStreamAlias("AliasName")`:用于指定类或字段的别名。 - `@XStreamAsAttribute()`:将类...

    xStream完整Jar包

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

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

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

    xstream-1.4.5.jar

    xstream xstream-1.4.5.jar

    xstream-1.3.1.zip

    使用XStream时,首先需要实例化XStream对象,然后通过`alias()`方法定义别名,以便简化XML中的元素名称。接着,调用`fromXML()`或`toXML()`方法进行对象到XML的转换或反之。例如: ```java XStream xstream = new ...

Global site tag (gtag.js) - Google Analytics