如何使用JAXB使用私有字段编组/解组Java对象

时间:2013-04-26 16:06:43

标签: java xml jaxb marshalling unmarshalling

我知道JAXB API的基础知识,但我遇到了一些我想做的事情,我不确定它是否真的可行。详情如下:

我有一个名为 Book 的类,其中包含2个 public 类型为String的实例变量:

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

    public Book() {
    }
}

我还有另一个名为 Bookshop 的类,其中包含1个类型为ArrayList的 public 实例变量:

@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才能使其类具有可序列性。或者,实例变量可以声明为私有,但在这种情况下需要访问器和更改器。

我不喜欢声明实例变量public;我喜欢使用访问器和变换器。即便如此,我希望我的一些字段是只读的,即没有变换器。但是JAXB似乎需要为每个要编组/解组的字段配置访问器和更改器。我想知道这有什么办法吗?

2 个答案:

答案 0 :(得分: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;
         ...

答案 1 :(得分:-3)

JAXB需要: - 公共实例变量 要么 - 具有公共mutators和访问器的私有实例变量。

你需要用于编组的变换器和用于解组的附件