簡體   English   中英

如何使用JAXB將Java對象與私有字段一起編組/解組

[英]How to marshal/unmarshal Java objects with private fields using JAXB

我知道JAXB API的基礎知識,但是我堅持嘗試做的事情,而且不確定是否確實可行。 詳細信息如下:

我有一個名為Book的類,帶有2個類型為String的公共實例變量:

@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似乎需要對要編組/解組的每個字段都使用訪問器和更改器。 我想知道是否有解決辦法?

在任何情況下,您都應保持字段私有。 您有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;
         ...

JAXB將需要:-一個公共實例變量,或者-一個具有公共變量和訪問器的私有實例變量。

您將需要mutators進行編組,需要acessor進行編組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM