7

我知道 JAXB API 的基础知识,但是我一直在尝试做一些事情,我不确定它是否真的可行。详情如下:

我有一个名为Book的类,它有 2 个字符串类型的公共实例变量:

@XmlRootElement(name="book")
public class Book
{
    public String title;
    public String author;

    public Book() {
    }
}

我有一个名为Bookshop的另一个类,它有 1个 ArrayList 类型的公共实例变量:

@XmlRootElement(name="bookshop")
public class Bookshop
{
    @XmlElementWrapper(name="book_list")
    @XmlElement(name="book")
    public ArrayList<Book> bookList;

    public Bookshop() {
        this.bookList = new ArrayList<>();
    }
}

注意:包声明和导入被删除以节省空间。

这两个类有效,我得到的输出 XML 类似于:

<bookshop>
    <book_list>
        <book>
            <title>Book 1</title>
            <author>Author 1</author>
        </book>
        <book>
            <title>Book 2</title>
            <author>Author 2</author>
        </book>
    </book_list>
</bookshop>

据我所知,实例变量需要声明为 public 才能使其类可序列化。或者,实例变量可以声明为私有的,但在这种情况下需要访问器和修改器。

我不喜欢公开实例变量;我喜欢使用访问器和修改器。即使这样,我也希望我的一些字段是只读的,即没有增变器。但是 JAXB 似乎对您想要编组/解组的每个字段都需要访问器和修改器。我想知道有没有办法解决这个问题?

4

2 回答 2

5

在任何情况下,您都应该将您的字段保密。您有 2 个选项绑定到字段

1) 使用 XmlElement 或 XmlAttribute 注释来注释您的字段

@XmlRootElement(name="book")
public class Book {
    @XmlElement
    private String title;
    ...

2) 用 @XmlAccessorType(XmlAccessType.FIELD) 注释你的类

    @XmlRootElement(name="book")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Book {
         private String title;
         ...
于 2013-04-26T16:14:54.927 回答
-3

JAXB 将需要: - 公共实例变量或 - 具有公共修改器和访问器的私有实例变量。

您将需要用于编组的 mutators 和用于解组的访问者

于 2013-04-26T16:12:18.167 回答