JAXB

Koleksi di Java
Level 3 , Pelajaran 7
Tersedia

"Jangan terlalu cepat, anak muda! Aku punya dua pelajaran lagi untukmu!"

"Dua? Wow. Baiklah, apa yang tidak akan kamu lakukan untuk meningkatkan kesejukanmu sendiri! Aku mendengarkan."

"XML, seperti JSON, sering digunakan saat mengirimkan data antara berbagai program dan komputer. Dan ada beberapa kerangka kerja yang sangat menyederhanakan kehidupan pemrogram Java saat bekerja dengan XML. Hari ini saya akan memperkenalkan salah satunya kepada Anda."

"JAXB adalah kerangka kerja multiguna yang luar biasa untuk bekerja dengan XML."

JAXB - 1

"JAXB adalah bagian dari JDK, jadi Anda tidak perlu mengunduhnya secara terpisah."

"Izinkan saya menunjukkan kepada Anda contoh cara menggunakannya terlebih dahulu, lalu kami akan menganalisisnya. Misalnya:"

Mengkonversi objek ke XML
public static void main(String[] args) throws JAXBException
{
 // Create an object to be serialized into XML
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 // Write the result of the serialization to a StringWriter
 StringWriter writer = new StringWriter();

 // Create a Marshaller object that will perform the serialization
 JAXBContext context = JAXBContext.newInstance(Cat.class);
 Marshaller marshaller = context.createMarshaller();
 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
 // And here's the serialization itself:
 marshaller.marshal(cat, writer);

 // Convert everything written to the StringWriter
 String result = writer.toString();
 System.out.println(result);
}
Kelas yang objeknya dikonversi ke XML
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}
Hasil serialisasi dan output layar:
<kucing> 
<nama> Nona </nama> 
<umur> 5 </umur> 
<berat> 4 </berat> 
</kucing>

"Untuk beberapa alasan, baris demi baris, kode ini mengingatkan saya pada serialisasi JSON. Anotasi yang sama, tetapi JSON menggunakan ObjectMapper, dan ini menggunakan Context dan Marshaller."

"Ya. Mereka benar-benar sangat mirip. Jackson meniru JAXB. Tapi JAXB juga disalin dari suatu tempat. Anda tidak dapat menemukan sesuatu yang jenius dari awal."

"Sepertinya begitu."

"Oke, inilah yang terjadi:"

"Pada baris 4-7, kita membuat objek Cat dan mengisinya dengan data."

"Di baris 10, kita membuat objek Writer untuk menulis hasilnya."

"Pada baris 13, kami membuat 'konteks'. Ini mirip dengan ObjectMapper, tetapi kemudian dua objek anak tambahan dibuat darinya. Marshaller untuk serialisasi, dan Unmarshaller untuk deserialisasi. Ada sedikit perbedaan dari Jackson, tetapi tidak tidak berbeda secara fundamental."

"Di baris 14, kami membuat objek Marshaller . Marshalling adalah sinonim untuk serialisasi."

"Pada baris 15, kami menyetel properti FORMATTED_OUTPUT ke TRUE. Ini akan menambahkan jeda baris dan spasi pada hasil, sehingga kode dapat dibaca oleh manusia, dan tidak hanya memiliki semua teks dalam satu baris."

"Di baris 17, kami membuat cerita bersambung objek."

"Pada baris 20-21, kami menampilkan hasil serialisasi di layar."

"Apa itu anotasi @XmlType(name = 'cat&') dan @XmlRootElement?"

" @XmlRootElement menunjukkan bahwa objek ini bisa menjadi 'akar pohon' elemen XML. Dengan kata lain, ini bisa menjadi elemen tingkat tertinggi, dan bisa berisi semua elemen lainnya."

" @XmlType(name = 'cat') menunjukkan bahwa kelas terlibat dalam serialisasi JAXB, dan juga menentukan nama tag XML untuk kelas ini."

"Baiklah, sekarang saya akan menunjukkan contoh deserialisasi XML:"

Mengonversi objek dari XML
public static void main(String[] args) throws JAXBException
{
 String xmldata = "<cat><name>Missy</name><age>5</age><weight>4</weight></cat>";
 StringReader reader = new StringReader(xmldata);

 JAXBContext context = JAXBContext.newInstance(Cat.class);
 Unmarshaller unmarshaller = context.createUnmarshaller();

 Cat cat = (Cat) unmarshaller.unmarshal(reader);
}
Kelas yang objeknya dideserialisasi dari XML
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}

"Semuanya hampir sama dengan Jackson. Tapi untuk berjaga-jaga, saya akan menjelaskan semua yang terjadi di sini."

"Di baris 3, kami meneruskan string yang menyimpan XML untuk dideserialisasi."

"Di baris 4, kami membungkus string-XML dalam sebuah StringReader ."

"Pada baris 6, kami membuat konteks JAXB , yang kami berikan daftar kelas."

"Pada baris 7, kita membuat Unmarshaller —objek yang akan melakukan deserialisasi."

"Sejalan 9, kami melakukan deserialisasi XML dari objek pembaca dan mendapatkan objek Cat."

"Sekarang semuanya tampak hampir jelas. Tapi beberapa jam yang lalu, saya memeras otak untuk mencari tahu cara kerjanya."

"Itu selalu terjadi saat kamu menjadi lebih pintar. Hal-hal rumit menjadi sederhana."

"Aku semakin pintar? Mau tidak mau aku senang karenanya."

"Bagus. Lalu inilah daftar anotasi yang dapat Anda gunakan untuk mengontrol hasil serialisasi JAXB:"

anotasi JAXB Keterangan
@XmlElement(nama) Ditempatkan di dekat lapangan.
Bidang akan disimpan dalam elemen XML.
Memungkinkan Anda mengatur nama tag.
@XmlAttribute(nama) Ditempatkan di dekat lapangan.
Bidang akan disimpan sebagai atribut XML!
Memungkinkan Anda mengatur nama atribut.
@XmlElementWrapper(nillable = true) Ditempatkan di dekat lapangan.
Memungkinkan Anda menyetel 'tag pembungkus' untuk sekelompok elemen.
@XmlType Ditempatkan di dekat kelas.
Memungkinkan Anda menentukan metode untuk membuat objek jika konstruktor defaultnya adalah pribadi.
@XmlJavaTypeAdapter Ditempatkan di dekat lapangan.
Memungkinkan Anda menentukan kelas yang akan mengonversi bidang menjadi string.

"Menarik sekali! Tapi bisakah Anda memberi saya contoh yang menggunakan anotasi ini? Penjelasan adalah satu hal, tetapi contoh yang berfungsi adalah hal lain."

"Oke. Saya akan tunjukkan contoh. Saya hanya ingin menambahkan bahwa JAXB memungkinkan Anda membuat anotasi metode pengambil/penyetel alih-alih bidang."

"Ini contoh yang saya janjikan:"

Mengkonversi objek ke XML
public static void main(String[] args) throws JAXBException
{
 // Create Cat and Zoo objects to be serialized into XML
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 Zoo zoo = new Zoo();
 zoo.animals.add(cat);
 zoo.animals.add(cat);

 // Write the result of the serialization to a StringWriter
 StringWriter writer = new StringWriter();

 // Create a Marshaller object that will perform the serialization
 JAXBContext context = JAXBContext.newInstance(Cat.class, Zoo.class);
 Marshaller marshaller = context.createMarshaller();
 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
 // Here's the serialization itself
 marshaller.marshal(zoo, writer);

 // Convert everything written to the StringWriter into a String
 System.out.println(writer.toString());
}
Kelas yang objeknya dikonversi ke XML
@XmlType(name = "zoo")
@XmlRootElement
public class Zoo
{
 @XmlElementWrapper(name = "wild-animals", nillable = true)
 @XmlElement(name = "tiger")
 public List<Cat> animals = new ArrayList<>();
}

public class Cat
{
 @XmlElement(name = "catname")
 public String name;
 @XmlAttribute(name = "age")
 public int age;
 @XmlAttribute(name = "w")
 public int weight;

 public Cat()
 {
 }
}
Hasil serialisasi dan output layar:
<zoo> 
<binatang liar> 
<umur harimau = "5" w = "4"> 
<nama kucing>Missy</nama kucing> </harimau> 
< 
umur harimau = "5" w = "4"> 
<nama kucing>Missy </namakucing> 
</harimau> < 
/hewan liar> 
</kebun binatang>

"Perhatikan bahwa kali ini kita tidak membuat serial objek Cat, tetapi objek Kebun Binatang yang menyimpan koleksi objek Cat."

"Objek cat ditambahkan ke koleksi dua kali, jadi itu ada di XML dua kali."

"Koleksi ini memiliki label ' hewan liar ' sendiri yang membungkus semua elemen koleksi."

" Elemen usia & bobot telah menjadi atribut usia & w w."

"Menggunakan atribut @XmlElement , kami mengubah tag kucing menjadi tag harimau ."

"Perhatikan baris 17. Di sini kami melewati dua kelas ( Kebun Binatang dan Kucing ) ke konteks JAXB, karena keduanya terlibat dalam serialisasi."

"Hari ini adalah hari yang sangat menarik. Begitu banyak informasi baru."

"Ya. Aku senang untukmu. Sekarang, istirahatlah sejenak dan kita akan melanjutkan."

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION