7

JAXB API の基本は知っていますが、やろうとしていることに行き詰まっており、それが実際に可能かどうかはわかりません。詳細は次のとおりです。

String 型の2 つのパブリックインスタンス変数を持つBookというクラスがあります。

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

    public Book() {
    }
}

タイプArrayListの1つのパブリックインスタンス変数を持つBookshopという別のクラスがあります。

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

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

注: スペースを節約するために、パッケージ宣言とインポートは削除されています。

これら 2 つのクラスが機能し、取得する出力 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