示例代码

  1. Blog teamBlog = new Blog(new Author("Guilherme Silveira"));
  2. teamBlog.add(new Entry("first","My first blog entry."));
  3. eamBlog.add(new Entry("tutorial","Today we have developed a nice alias tutorial. Tell your friends! NOW!"));
  4. XStream xstream = new XStream();
  5. System.out.println(xstream.toXML(teamBlog));

打印结果为:

  1. <xtream.Blog>
  2. <writer>
  3. <name>Guilherme Silveira</name>
  4. </writer>
  5. <entries>
  6. <xtream.Entry>
  7. <title>first</title>
  8. <description>My first blog entry.</description>
  9. </xtream.Entry>
  10. <xtream.Entry>
  11. <title>tutorial</title>
  12. <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description>
  13. </xtream.Entry>
  14. </entries>
  15. </xtream.Blog>

以上节点就包含了包名,如包名很长,就很难看了,怎样才能重新命名这个节点呀! 
以下的1,2设置效果一样

  1. 1 //xstream.aliasPackage("", "xtream");
  2. 2 xstream.alias("blog", Blog.class);
  3. 3 xstream.alias("entry", Entry.class);

通过这样设置就完成了节点名称的设置.如下:

  1. <blog>
  2. <writer>
  3. <name>Guilherme Silveira</name>
  4. </writer>
  5. <entries>
  6. <entry>
  7. <title>first</title>
  8. <description>My first blog entry.</description>
  9. </entry>
  10. <entry>
  11. <title>tutorial</title>
  12. <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description>
  13. </entry>
  14. </entries>
  15. </blog>

修改子节点属性名称 
将writer属性名称修改为:autor

  1. xstream.aliasField("author", Blog.class, "writer");

输出如下:

  1. <blog>
  2. <author>
  3. <name>Guilherme Silveira</name>
  4. </author>
  5. <entries>
  6. <entry>
  7. <title>first</title>
  8. <description>My first blog entry.</description>
  9. </entry>
  10. <entry>
  11. <title>tutorial</title>
  12. <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description>
  13. </entry>
  14. </entries>
  15. </blog>

删除集合节点名称的设置

  1. xstream.addImplicitCollection(Blog.class, "entries");

输出如下:

  1. <blog>
  2. <author>
  3. <name>Guilherme Silveira</name>
  4. </author>
  5. <entry>
  6. <title>first</title>
  7. <description>My first blog entry.</description>
  8. </entry>
  9. <entry>
  10. <title>tutorial</title>
  11. <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description>
  12. </entry>
  13. </blog>

将Blog类的元素设置为:它的节点属性 
//使用这个属性名作为节点上的元素

  1. xstream.useAttributeFor(Blog.class, "writer");

//重新命名

  1. xstream.aliasField("author", Blog.class, "writer");

//注册转换器

  1. xstream.registerConverter(new AuthorConverter());

转换器:

  1. import com.thoughtworks.xstream.converters.SingleValueConverter;
  2. class AuthorConverter implements SingleValueConverter {
  3. //显示节点属性值
  4. public String toString(Object obj) {
  5. return ((Author) obj).getName();
  6. }
  7. public Object fromString(String name) {
  8. return new Author(name);
  9. }
  10. public boolean canConvert(Class type) {
  11. return type.equals(Author.class);
  12. }
  13. }

显示结果:

  1. <blog author="Guilherme Silveira">
  2. <entry>
  3. <title>first</title>
  4. <description>My first blog entry.</description>
  5. </entry>
  6. <entry>
  7. <title>tutorial</title>
  8. <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description>
  9. </entry>
  10. </blog>

注解的使用方式,使用之前必须加上注解类才有作用:

  1. XStream xstream = new XStream();
  2. xstream.processAnnotations(Blog.class);
  3. xstream.processAnnotations(Entry.class);

1  @XStreamAlias注解可在类与属性上使用设置名称,相当于: xstream.alias("blog", Blog.class);

  1. @XStreamAlias("blog")
  2. public class Blog {
  3. @XStreamAlias("author")
  4. private Author writer;
  5. .....
  6. }

当然Entry类也要设置同样的类属性:@XStreamAlias("entity") 
2 @XStreamImplicit去集合节点名:相当于 xstream.addImplicitCollection(Blog.class, "entries"); 
3 @XStreamConverter(AuthorConverter.class),参见以上的转换器类相当于:

  1. xstream.useAttributeFor(Blog.class, "writer");
  2. //重新命名
  3. xstream.aliasField("author", Blog.class, "writer");
  4. //注册转换器
  5. xstream.registerConverter(new AuthorConverter());

要使用这个注解AuthorConverter必须符合二个条件 
a 必须要有个默认的无参构造函数

  1. public AuthorConverter() {
  2. }

b 类声明必须为:public

  1. public class AuthorConverter implements SingleValueConverter {
  2. ...
  3. }

不用注解这二点都可以不强制要求! 
完整代码如下:

    1. import com.thoughtworks.xstream.XStream;
    2. import com.thoughtworks.xstream.annotations.XStreamAlias;
    3. import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
    4. import com.thoughtworks.xstream.annotations.XStreamConverter;
    5. import com.thoughtworks.xstream.annotations.XStreamImplicit;
    6. @XStreamAlias("blog")
    7. public class Blog {
    8. @XStreamAsAttribute
    9. @XStreamAlias("author")
    10. @XStreamConverter(AuthorConverter.class)
    11. private Author writer;
    12. @XStreamImplicit
    13. private List entries = new ArrayList();
    14. public Blog(Author writer) {
    15. this.writer = writer;
    16. }
    17. public void add(Entry entry) {
    18. entries.add(entry);
    19. }
    20. public List getContent() {
    21. return entries;
    22. }
    23. public static void main(String[] args) {
    24. Blog teamBlog = new Blog(new Author("Guilherme Silveira"));
    25. teamBlog.add(new Entry("first", "My first blog entry."));
    26. teamBlog
    27. .add(new Entry("tutorial",
    28. "Today we have developed a nice alias tutorial. Tell your friends! NOW!"));
    29. XStream xstream = new XStream();
    30. xstream.processAnnotations(Blog.class);
    31. xstream.processAnnotations(Entry.class);
    32. // 重新命名节点名
    33. // xstream.aliasPackage("", "xtream");
    34. /*
    35. * xstream.alias("blog", Blog.class); xstream.alias("entry",
    36. * Entry.class); //重新命名属性名 // xstream.aliasField("author", Blog.class,
    37. * "writer"); //去节点 xstream.addImplicitCollection(Blog.class,
    38. * "entries"); // xstream.useAttributeFor(Blog.class, "writer"); //
    39. * xstream.aliasField("author", Blog.class, "writer"); //
    40. * xstream.addImplicitCollection(Blog.class, "entries");
    41. * //使用这个属性名作为节点上的元素 xstream.useAttributeFor(Blog.class, "writer");
    42. * //重新命名 xstream.aliasField("author", Blog.class, "writer"); //注册转换器
    43. * xstream.registerConverter(new AuthorConverter());
    44. */
    45. System.out.println(xstream.toXML(teamBlog));
    46. }
    47. }

Xstream之常用方式与常用注解的更多相关文章

  1. 分方式缓存常用的一致性hash是什么原理

    分方式缓存常用的一致性hash是什么原理 一致性hash是用来解决什么问题的?先看一个场景有n个cache服务器,一个对象object映射到哪个cache上呢?可以采用通用方法计算object的has ...

  2. Windows校验文件哈希hash的两种常用方式

    大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...

  3. 操作xml文档的常用方式

    1.操作XML文档的两种常用方式: 1)使用XmlReader类和XmlWriter类操作 XmlReader是基于数据流的,占用极少的内存,是只读方式的,所以速度极快.只能采用遍历的模式查找数据节点 ...

  4. 查看Oracle SQL执行计划的常用方式

    在查看SQL执行计划的时候有很多方式 我常用的方式有三种 SQL> explain plan for 2 select * from scott.emp where ename='KING'; ...

  5. iOS应用数据存储的常用方式

    iOS应用 数据存储的常用方式 XML属性列表 plist Preference 偏好设置 NSKeyedArchiver 归档 Core Data SQLite3 应用沙盒: Layer:     ...

  6. Postman几种常用方式

    Postman几种常用方式 1.get请求直接拼URL形式 对于http接口,有get和post两种请求方式,当接口说明中未明确post中入参必须是json串时,均可用url方式请求 参数既可以写到U ...

  7. JS类继承常用方式发展史

    JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...

  8. 【转】shell:date 常用方式

    在linux下获取时间字符串 命令 date # 以yyyymmdd格式输出23天之前现在这个时刻的时间 $ date +%Y%m%d –date=’23 days ago’ $ date -u Th ...

  9. Ajax—web中ajax的常用方式

    什么Web2.0的特点? 1:注重用户贡献度 2:内容聚合RSS协议(每小块都个性化,单独加载单独请求,不用全部刷新--Ajax) 3:更丰富的用户体验 Ajax的概念? "Asynchro ...

随机推荐

  1. Eclipse - 安装 run-jetty-run 插件及使用 jrebel 热部署

    安装 run-jetty-run 插件 1. 下载 run-jetty-run 2. 解压至 Eclipse/MyEclipse 安装目录下的 plugin 3. 右键 web 项工程,选择 Run ...

  2. Handler 原理分析和使用之HandlerThread

    前面已经提到过Handler的原理以及Handler的三种用法.这里做一个非常简单的一个总结: Handler 是跨线程的Message处理.负责把Message推送到MessageQueue和处理. ...

  3. 面向对象 ---Java抽象类

    在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化对象之外, ...

  4. C#当中的多线程_任务并行库(中)

    发现自己有点懒了!也可能是越往后越难了,看书理解起来有点费劲,所以这两天就每天更新一点学习笔记吧. 4.5 将APM模式转化为任务 书上提供的三种方式 方式一: class Program       ...

  5. jquery动态插入行,不用拼写html,简洁版

    这个一个利用jquery实现动态插入输入行效果小功能,不用在javascript里拼写html字符串,更简洁.高效. html代码: <div class="fitem"&g ...

  6. Ubuntu1404+Django1.9+Apache2.4部署配置2配置文件设置

    转载注明出处,个人博客:http://www.cnblogs.com/wdfwolf3/ Django首要的部署平台是WSGI,它是Python Web服务器和应用的标准.使用Apache和mod_w ...

  7. 实现基于文件存储的Session类

    自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 一般基于文件存储Session数据效率不是很高 ...

  8. [lua]原来这才是表驱动的正确表达方式

    曾经写了个很煞笔的脚本模拟switch..case语法形式.[lua]尝试一种Case语法糖 而今实际项目应用中突发,原来这才是正确的表驱动方式表达.如下所贴: function event_do( ...

  9. pip 的 Assert Error

    在Ubuntu 14.04 中安装了Python之后,使用pip freeze,出现AssertError. 发现是pip版本太低,只有1.5.6 更新pip之后就OK了.

  10. [CSS]overflow内容溢出

      定义和用法 overflow 属性规定当内容溢出元素框时发生的事情. 说明 这个属性定义溢出元素内容区的内容会如何处理.如果值为 scroll,不论是否需要,用户代理都会提供一种滚动机制.因此,有 ...