`
tuxq5721
  • 浏览: 34448 次
社区版块
存档分类
最新评论

XStream指定别名

阅读更多

总结

要达到的效果

需要的Model

简单测试

类别名

字段别名

隐式集合

属性别名

包别名

 

总结

主要如下:

    • 可以使用类的别名来改变标签名称
    • 可以使用字段的别名来改变标签名称
    • 可以使用包别名来改变标签名称
    • 如果字段类型是由一个SingleValueConverter处理,可写为属性

 

要达到的效果

使用XStream生成如下格式的XML

<blogauthor="张三">

 <entry>

   <title>文章1</title>

   <description>这是文章1</description>

 </entry>

 <entry>

   <title>文章2</title>

   <description>

       这是文章2

   </description>

 </entry>

</blog>

 

需要的Model

Blog

publicclass Blog {

private Authorwriter;

private List<Entry>entries = new ArrayList<>();

 

public Blog(Author writer) {this.writer = writer;}

public Author getWriter() {returnwriter;}

publicvoid setWriter(Author writer) {this.writer = writer;}

public List<Entry> getEntries() {returnentries;}

publicvoid setEntries(List<Entry> entries) {this.entries = entries;}

 

publicvoid add(Entry entry) {entries.add(entry);}

public List<Entry> getContent() {returnentries;}

}

Author.java

publicclass Author {

private Stringname;

public Author(String name) {this.name = name;}

public String getName() {returnname;}

publicvoid setName(String name) {this.name = name;}

}

Entry.java

publicclass Entry {

private Stringtitle;

private Stringdescription;

 

public Entry(String title, String description) {

this.title = title;

this.description = description;

}

 

public String getTitle() {returntitle;}

publicvoid setTitle(String title) {this.title = title;}

public String getDescription() {returndescription;}

publicvoid setDescription(String description) {this.description = description;}

}

 

简单测试

创建Blog类实例,并使用XStream生成XML

publicclass XStreamTest {

publicstaticvoid main(String[] args) {

Blog teamBlog =new Blog(new Author("张三"));

teamBlog.add(new Entry("文章1","这是文章1"));

teamBlog.add(new Entry("文章2","这是文章2"));

 

XStream xstream = new XStream();

System.out.println(xstream.toXML(teamBlog));

}

}

生成的格式如下:

<xstream.Blog>

 <writer>

   <name>张三</name>

 </writer>

 <entries>

   <xstream.Entry>

     <title>文章1</title>

     <description>这是文章1</description>

   </xstream.Entry>

   <xstream.Entry>

     <title>文章2</title>

     <description>这是文章2</description>

   </xstream.Entry>

 </entries>

</xstream.Blog>

 

类别名

改变标签名xstream.Blogblogxstream.Entryentry

xstream.alias("blog", Blog.class);

xstream.alias("entry", Entry.class);

结果现在变成了:

<blog>

 <writer>

   <name>张三</name>

 </writer>

 <entries>

   <entry>

     <title>文章1</title>

     <description>这是文章1</description>

   </entry>

   <entry>

     <title>文章2</title>

     <description>这是文章2</description>

   </entry>

 </entries>

</blog>

 

字段别名

改变标签writer的名字,但这次要使用一个字段的别名:

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

现在结果变成了这样:

<blog>

 <author>

   <name>张三</name>

 </author>

 <entries>

   <entry>

     <title>文章1</title>

     <description>这是文章1</description>

   </entry>

   <entry>

     <title>文章2</title>

     <description>这是文章2</description>

   </entry>

 </entries>

</blog>

 

隐式集合

如果不需要显示 entries标签,可通过addImplicitCollection方法不让其显示:

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

现在的结果:

<blog>

 <author>

   <name>张三</name>

 </author>

 <entry>

   <title>文章1</title>

   <description>这是文章1</description>

 </entry>

 <entry>

   <title>文章2</title>

   <description>这是文章2</description>

 </entry>

</blog>

 

属性别名

writer 成员变量设置为一个XML 属性。

告诉XStream,其中Blog类的 author字段将做为一个author属性:

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

实现SingleValueConverter

publicclass AuthorConverterimplements SingleValueConverter { 

@Override

publicboolean canConvert(Class type) {

return type.equals(Author.class);

}

 

@Override

public Object fromString(String name) {

returnnew Author(name);

}

 

@Override

public String toString(Object obj) {

return ((Author) obj).getName();

}

}

注册这个转换器:AuthorConverter

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

xstream.registerConverter(new AuthorConverter());

完整代码:

publicclass XStreamTest {

publicstaticvoid main(String[] args) {

Blog teamBlog =new Blog(new Author("张三"));

teamBlog.add(new Entry("文章1","这是文章1"));

teamBlog.add(new Entry("文章2","这是文章2"));

 

XStream xstream = new XStream();

//类别名

xstream.alias("blog", Blog.class);

xstream.alias("entry", Entry.class);

 

//字段别名

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

 

//隐式集合

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

 

//属性别名

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

xstream.registerConverter(new AuthorConverter());

 

System.out.println(xstream.toXML(teamBlog));

}

}

运行结果:

<blogauthor="张三">

 <entry>

   <title>文章1</title>

   <description>这是文章1</description>

 </entry>

 <entry>

   <title>文章2</title>

   <description>这是文章2</description>

 </entry>

</blog>

 

属性别名

回到前面,在没有使用类别名的情况下所输出的标签名,显示的是全限定类名:xstream.Blog,现在需要将其更换为:cn.itcast.Blog

publicstaticvoid main(String[] args) {

Blog teamBlog =new Blog(new Author("张三"));

teamBlog.add(new Entry("文章1","这是文章1"));

teamBlog.add(new Entry("文章2","这是文章2"));

 

XStream xstream = new XStream();

xstream.aliasPackage("cn.itcast","xstream");

System.out.println(xstream.toXML(teamBlog));

}

结果:

<cn.itcast.Blog>

 <writer>

   <name>张三</name>

 </writer>

 <entries>

   <cn.itcast.Entry>

     <title>文章1</title>

     <description>这是文章1</description>

   </cn.itcast.Entry>

   <cn.itcast.Entry>

     <title>文章2</title>

     <description>这是文章2</description>

   </cn.itcast.Entry>

 </entries>

</cn.itcast.Blog>

 

已使用 广州传智播客 创建。

分享到:
评论

相关推荐

    XStream XML与Json转换

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

    Xstream生产xml和解析xml

    2. **类成员别名**:通过`aliasField(String alias, Class definedIn, String fieldName)`方法,可以为特定的类成员指定别名。 3. **类成员属性别名**:结合`aliasAttribute(Class definedIn, String attributeName,...

    xstream-1.4-API

    - **忽略字段(Ignored Fields)**: 使用 `ignoreField()` 方法可指定哪些字段不参与序列化和反序列化。 ### 5. **自定义转换器(Converters)** 对于 XStream 不支持的复杂类型,可以通过实现 `Converter` 接口或...

    XStream Java下的使用

    XStream提供了一些高级配置,如忽略某些字段、指定日期格式等。例如,可以使用`ignoreUnknownElements()`方法忽略未知的XML元素,避免因XML结构变化导致的异常。 6. **处理集合** 当需要序列化集合时,XStream会...

    xstream-1.3.1.jar

    而绑定则允许开发者为类或字段指定别名,使得XML中的元素名称更简洁易读。 在使用XStream时,我们通常会先创建一个XStream实例,然后通过它的各种方法来配置和定制XML到对象的转换规则。例如,我们可以添加自定义的...

    XStream.zip

    如果要在生成的XML文件开头添加XML声明,可以使用`XStream.createXMLStreamWriter()`方法,或者在创建`XStream`实例时指定`DomDriver`并设置编码: ```java XStream xstream = new XStream(new DomDriver("UTF-8"))...

    xstream源码

    - XStream可以处理XML命名空间,通过`aliasNamespace()`方法,用户可以为XML命名空间指定别名,简化XML结构。 7. **性能优化** - 使用缓存机制:XStream缓存已序列化的对象和字段,提高重复序列化时的性能。 - ...

    xstream解析xml

    在描述中提到的`@XStreamAlias`是XStream提供的一个关键注解,用于给Java类或字段指定一个别名,这个别名将在生成的XML中作为元素名称出现。例如: ```java @XStreamAlias("person") public class Person { ...

    XStream示例(含jar包)

    - **注解支持**:XStream 提供了注解支持,可以在 Java 类上使用注解来指定字段的 XML 或 JSON 映射。 - **安全性**:在序列化和反序列化时,需要注意防止代码注入攻击。XStream 提供了安全模式来限制可序列化的类...

    xstream.jar

    XStream允许你在序列化时指定类型信息,防止因XML丢失类型信息导致的反序列化错误。 2. **自动转换**: XStream可以自动处理日期、时间等复杂类型,无需额外的转换器。 3. **自定义转换器**: 对于无法自动处理...

    XStream在JavaBean与XML/JSON 之间相互转换

    可以通过`xstream.addPermission(NoTypePermission.NONE)`来限制默认行为,并通过`xstream.allowTypesByWildcard(new String[]{"com.example.**"})`指定可序列化的类路径。 **六、总结** XStream作为Java中强大的...

    xstream-1.4.4

    1. **类型安全**:通过`aliasForSystemAttribute()`方法,可以为XML属性设置别名,防止属性名冲突。 2. **忽略字段**:使用`ignoreFields()`方法,可以指定哪些字段不应出现在XML中。 3. **域模型的版本控制**:...

    Xstream操作Xml与Json.doc

    - **Xstream.omitField()**: 隐藏指定的字段,使其不会出现在 XML 或 JSON 中。 ### 4. Xstream 注解的使用 Xstream 支持使用 Java 注解来自定义序列化行为: #### (1) 设置 Xstream 应用注解 可以通过 `Xstream...

    xStream完美转换XML.docx

    2. **初始化xStream实例**:创建一个`XStream`实例,可以指定不同的驱动器来支持XML或JSON输出。 ```java XStream xstream = new XStream(); // 或者,如果需要XML解析器支持,可以使用以下方式: // xstream = new...

    开源软件包XStream及入门文档

    3. **忽略字段**:调用`ignoreField(Class&lt;?&gt; clazz, String fieldName)`可以忽略指定对象的某个字段,使其不会出现在XML中。 4. **转换器注册**:对于自定义的复杂类型,可以实现`Converter`接口并注册到XStream...

    XStream使用方法总结-对象-转换.txt

    **注意**:如果设置了属性别名,还需要使用`xstream.useAttributeFor(Person.class, "name")`来指定该属性应作为XML元素的属性。 2. **隐式集合** 对于Java对象中的集合类型,可以使用`addImplicitCollection`...

    xstream入门例子

    XStream 可以处理任何 Java 对象,但为了防止安全问题,你需要为每个要序列化的类指定允许的字段。这可以通过 `aliasField()` 或 `aliasType()` 方法完成。例如,假设我们有一个名为 `Person` 的类: ```java ...

    使用xstream实现对JavaBean与xml字符串的互转

    例如,你可以使用`alias()`方法为类或字段指定别名: ```java xstream.alias("person", User.class); xstream.aliasField("usrName", User.class, "name"); ``` 此外,还可以使用`converters`来处理特殊的类型转换...

    Java转换xml.zip

    3. 配置XStream:你可以自定义转换规则,比如忽略某些字段,或者为字段指定别名。例如,`xstream.alias("user", User.class);` 4. 序列化Java对象为XML:`String xml = xstream.toXML(user);` 5. 反序列化XML为...

Global site tag (gtag.js) - Google Analytics