|
总结 |
主要如下: |
|
|
要达到的效果 |
使用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.Blog为blog、xstream.Entry为entry: |
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> |
已使用 广州传智播客 创建。
相关推荐
但是当对象和字段名与XML中的元素名不同时,XStream支持指定别名。XStream支持以方法调用的方式,或是Java 标注的方式指定别名。 XStream在进行数据类型转换时,使用系统缺省的类型转换器。同时,也支持用户自定义...
2. **类成员别名**:通过`aliasField(String alias, Class definedIn, String fieldName)`方法,可以为特定的类成员指定别名。 3. **类成员属性别名**:结合`aliasAttribute(Class definedIn, String attributeName,...
- **忽略字段(Ignored Fields)**: 使用 `ignoreField()` 方法可指定哪些字段不参与序列化和反序列化。 ### 5. **自定义转换器(Converters)** 对于 XStream 不支持的复杂类型,可以通过实现 `Converter` 接口或...
XStream提供了一些高级配置,如忽略某些字段、指定日期格式等。例如,可以使用`ignoreUnknownElements()`方法忽略未知的XML元素,避免因XML结构变化导致的异常。 6. **处理集合** 当需要序列化集合时,XStream会...
而绑定则允许开发者为类或字段指定别名,使得XML中的元素名称更简洁易读。 在使用XStream时,我们通常会先创建一个XStream实例,然后通过它的各种方法来配置和定制XML到对象的转换规则。例如,我们可以添加自定义的...
如果要在生成的XML文件开头添加XML声明,可以使用`XStream.createXMLStreamWriter()`方法,或者在创建`XStream`实例时指定`DomDriver`并设置编码: ```java XStream xstream = new XStream(new DomDriver("UTF-8"))...
- XStream可以处理XML命名空间,通过`aliasNamespace()`方法,用户可以为XML命名空间指定别名,简化XML结构。 7. **性能优化** - 使用缓存机制:XStream缓存已序列化的对象和字段,提高重复序列化时的性能。 - ...
在描述中提到的`@XStreamAlias`是XStream提供的一个关键注解,用于给Java类或字段指定一个别名,这个别名将在生成的XML中作为元素名称出现。例如: ```java @XStreamAlias("person") public class Person { ...
- **注解支持**:XStream 提供了注解支持,可以在 Java 类上使用注解来指定字段的 XML 或 JSON 映射。 - **安全性**:在序列化和反序列化时,需要注意防止代码注入攻击。XStream 提供了安全模式来限制可序列化的类...
XStream允许你在序列化时指定类型信息,防止因XML丢失类型信息导致的反序列化错误。 2. **自动转换**: XStream可以自动处理日期、时间等复杂类型,无需额外的转换器。 3. **自定义转换器**: 对于无法自动处理...
可以通过`xstream.addPermission(NoTypePermission.NONE)`来限制默认行为,并通过`xstream.allowTypesByWildcard(new String[]{"com.example.**"})`指定可序列化的类路径。 **六、总结** XStream作为Java中强大的...
1. **类型安全**:通过`aliasForSystemAttribute()`方法,可以为XML属性设置别名,防止属性名冲突。 2. **忽略字段**:使用`ignoreFields()`方法,可以指定哪些字段不应出现在XML中。 3. **域模型的版本控制**:...
- **Xstream.omitField()**: 隐藏指定的字段,使其不会出现在 XML 或 JSON 中。 ### 4. Xstream 注解的使用 Xstream 支持使用 Java 注解来自定义序列化行为: #### (1) 设置 Xstream 应用注解 可以通过 `Xstream...
2. **初始化xStream实例**:创建一个`XStream`实例,可以指定不同的驱动器来支持XML或JSON输出。 ```java XStream xstream = new XStream(); // 或者,如果需要XML解析器支持,可以使用以下方式: // xstream = new...
3. **忽略字段**:调用`ignoreField(Class<?> clazz, String fieldName)`可以忽略指定对象的某个字段,使其不会出现在XML中。 4. **转换器注册**:对于自定义的复杂类型,可以实现`Converter`接口并注册到XStream...
**注意**:如果设置了属性别名,还需要使用`xstream.useAttributeFor(Person.class, "name")`来指定该属性应作为XML元素的属性。 2. **隐式集合** 对于Java对象中的集合类型,可以使用`addImplicitCollection`...
XStream 可以处理任何 Java 对象,但为了防止安全问题,你需要为每个要序列化的类指定允许的字段。这可以通过 `aliasField()` 或 `aliasType()` 方法完成。例如,假设我们有一个名为 `Person` 的类: ```java ...
例如,你可以使用`alias()`方法为类或字段指定别名: ```java xstream.alias("person", User.class); xstream.aliasField("usrName", User.class, "name"); ``` 此外,还可以使用`converters`来处理特殊的类型转换...
3. 配置XStream:你可以自定义转换规则,比如忽略某些字段,或者为字段指定别名。例如,`xstream.alias("user", User.class);` 4. 序列化Java对象为XML:`String xml = xstream.toXML(user);` 5. 反序列化XML为...