ITPub博客

首页 > > > 实现 Castor 数据绑定--转-3

实现 Castor 数据绑定--转-3

作者:longmanma 时间:2020-01-06 09:36:56 0 删除 编辑

Castor 遗漏了什么

在改进这个例子之前 — 很有必要改进— 先看看 Castor 在 XML 中漏掉了什么:

Java 类的包。Java 包不属于类结构。这实际上是一个语义问题,和 Java 名称空间有关。因此可以将这个 XML 文档解组 — 从 XML 转换为 Java 代码 — 到任何具有相同的三个属性的Book实例,不论是什么包。

字段顺序。这是 XML 的顺序问题,和 Java 编程无关。因此尽管源文件按某种顺序列出字段,但 XML 文档可能完全不同。这对于 XML 来说至关重要,但是和Book类声明无关。

方法。和包声明一样,方法也和数据结构无关。因此 XML 文档没有涉及到这些方面,将其忽略了。

那么就要问 “那又怎么样呢?” 如果不重要,XML 忽略这些细节又有什么关系呢?但是这些信息很重要。之所以重要是因为它们提供了超出预想的更大的灵活性。可以将这些 XML 解组为满足最低要求的任何类:

类名为 “Book”(使用映射文件可以改变,但这一点后面再说)。

这个类包括三个字段:authorName、title和isbn。

仅此而已!看看能否编写满足这些要求的几个类,并改变类的其他字段或者包声明、方法……很快您就会发现这种方法使得 Castor 多么灵活。

 

回页首

添加更复杂的类型

Book类最明显的不足是不能存储多个作者。修改类使其能处理多个作者也很容易:

清单 4. 存储多个作者的 Book 类

package ibm.xml.castor;import java.util.LinkedList;

import java.util.List;public class Book { /** The book's ISBN */ private String isbn; /** The book's title */ private String title; /** The authors' names */ privateList authorNames;public Book(String isbn, String title, List authorNames) {

this.isbn = isbn;

this.title = title;

this.authorNames = authorNames;

}public Book(String isbn, String title, String authorName) { this.isbn = isbn; this.title = title;this.authorNames = new LinkedList();

authorNames.add(authorName);} public String getIsbn() { return isbn; } public void setTitle(String title) { this.title = title; } public String getTitle() { return title; } public void setAuthorNames(List authorNames) { this.authorNames = authorNames; } publicListgetAuthorNames() { return authorNames; }public void addAuthorName(String authorName) {

authorNames.add(authorName);

}}

如果使用 Java 5 或 6 技术,将会显示一些未检查/不安全操作的错误,因为这段代码没有使用参数化的 Lists。如果愿意可以自己增加这些代码。

这样的修改很简单,不需要对编组代码作任何修改。但是,有必要用一本多人编写的图书来验证 Castor 编组器能否处理集合。修改BookMarshaller类如下:

清单 5. 处理收集器的 Book 类

package ibm.xml.castor;import java.io.FileWriter;import java.util.ArrayList;

import java.util.List;import org.exolab.castor.xml.Marshaller;public class BookMarshaller { public static void main(String[] args) { try { Book book = new Book("9780312347482", "Power Play", "Joseph Finder"); FileWriter writer = new FileWriter("book.xml"); Marshaller.marshal(book, writer);List book2Authors = new ArrayList();

book2Authors.add("Douglas Preston");

book2Authors.add("Lincoln Child");

Book book2 = new Book("9780446618502", "The Book of the Dead",

book2Authors);

writer = new FileWriter("book2.xml");

Marshaller.marshal(book2, writer);} catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(System.err); } }}

第一本书的处理方式没有变,重新打开book.xml将看到和原来相同的结果。打开book2.xml看看 Castor 如何处理集合:

清单 6. 带有收集器的 XML 结果

<?xml version="1.0" encoding="UTF-8"?>

<book><isbn>9780446618502</isbn><title>The Book of the Dead</title>

<author-names xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:type="java:java.lang.String">Douglas Preston</author-names>

<author-names xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:type="java:java.lang.String">Lincoln Child</author-names>

</book>

显然,Castor 处理作者姓名列表没有问题。更重要的是,Castor 不仅为作者名称创建了一个 blanket 容器,这个框架实际上看到了列表的内部,并认识到内容是字符串(要记住,这不是参数化列表,Castor 必须自己确定列表成员的类型)。因此 XML 进行了一些非常具体的类型化工作。这是个不错的特性,尤其是如果需要将 XML 转化回 Java 代码之前进行一些处理的话。

 

回页首

添加自定义类

我们朝着真正实用的程序再前进一步。存储字符串作者姓名肯定最终会出现重复的数据(多数作者写了不只一本书)。清单 7 增加了一个新的类Author。

清单 7. Author 类

package ibm.xml.castor;

public class Author {

private String firstName, lastName;

private int totalSales;

public Author(String firstName, String lastName) {

this.firstName = firstName;

this.lastName = lastName;

}

public String getFirstName() {

return firstName;

}

public String getLastName() {

return lastName;

}

public void setTotalSales(int totalSales) {

this.totalSales = totalSales;

}

public void addToSales(int additionalSales) {

this.totalSales += additionalSales;

}

public int getTotalSales() {

return totalSales;

}

}

是不是很简单?在Book类的下面作上述修改以便能够使用新的Author类。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2730/viewspace-3160905/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: Hadoop之回收站
请登录后发表评论 登录
全部评论

注册时间:2019-12-18

  • 博文量
    492
  • 访问量
    12002