"Tidak begitu cepat, anak muda! Saya ada dua lagi pelajaran untuk awak!"

"Dua? Wah. Baiklah. Apa yang anda tidak akan lakukan untuk meningkatkan kesejukan anda sendiri! Saya semua telinga."

"XML, seperti JSON, sering digunakan apabila menghantar data antara program dan komputer yang berbeza. Dan terdapat beberapa rangka kerja yang sangat memudahkan kehidupan pengaturcara Java apabila bekerja dengan XML. Hari ini saya akan memperkenalkan anda kepada salah satu daripada mereka."

"JAXB ialah rangka kerja pelbagai guna yang sangat baik untuk bekerja dengan XML."

JAXB - 1

"JAXB ialah sebahagian daripada JDK, jadi anda tidak perlu memuat turunnya secara berasingan."

"Biar saya tunjukkan contoh cara menggunakannya dahulu, kemudian kami akan menganalisisnya. Contohnya:"

Tukar objek kepada 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 ditukar kepada XML
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}
Hasil siri dan output skrin:
<kucing> 
<nama> Missy </nama> 
<umur> 5 </umur> 
<berat> 4 </berat> 
</kucing>

"Atas sebab tertentu, baris demi baris, kod ini mengingatkan saya tentang siri JSON. Anotasi yang sama, tetapi JSON menggunakan ObjectMapper, dan ini menggunakan Context dan Marshaller."

"Ya. Mereka benar-benar serupa. Jackson dimodelkan mengikut JAXB. Tetapi JAXB juga ditiru dari mana-mana. Anda tidak boleh mencipta sesuatu yang genius dari awal."

"Nampaknya begitu."

"OK, inilah yang berlaku:"

"Dalam baris 4-7, kami mencipta objek Cat dan mengisinya dengan data."

"Dalam baris 10, kami mencipta objek Penulis untuk menulis hasilnya."

"Dalam baris 13, kami mencipta 'konteks'. Ini serupa dengan ObjectMapper, tetapi kemudian dua objek kanak-kanak tambahan dicipta daripadanya. Marshaller adalah untuk bersiri, dan Unmarshaller adalah untuk penyahserikatan. Terdapat perbezaan kecil daripada Jackson, tetapi ia tidak pada asasnya tidak berbeza."

"Dalam baris 14, kami mencipta objek Marshaller . Marshalling ialah sinonim untuk bersiri."

"Dalam baris 15, kami menetapkan sifat FORMATTED_OUTPUT kepada TRUE. Ini akan menambah pemisah baris dan ruang pada hasil, supaya kod itu boleh dibaca manusia dan bukan hanya mempunyai semua teks pada satu baris."

"Dalam baris 17, kami menyerikan objek itu."

"Dalam baris 20-21, kami memaparkan hasil siri pada skrin."

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

" @XmlRootElement menunjukkan bahawa objek ini boleh menjadi 'akar pokok' elemen XML. Dalam erti kata lain, ia boleh menjadi elemen tahap tertinggi dan boleh mengandungi semua elemen lain."

" @XmlType(name = 'cat') menunjukkan bahawa kelas terlibat dalam penyiaran JAXB, dan juga menentukan nama teg XML untuk kelas ini."

"Baiklah, sekarang saya akan menunjukkan kepada anda contoh penyahserikatan XML:"

Tukar objek daripada 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 dinyahsiri daripada XML
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}

"Semuanya hampir sama dengan Jackson. Tetapi untuk berjaga-jaga, saya akan menerangkan semua yang berlaku di sini."

"Dalam baris 3, kami menghantar rentetan yang menyimpan XML untuk dinyahsiri."

"Dalam baris 4, kami membalut rentetan XML dalam StringReader ."

"Dalam baris 6, kami mencipta konteks JAXB , yang mana kami lulus senarai kelas."

"Dalam baris 7, kami mencipta Unmarshaller —objek yang akan melakukan penyahserikatan."

"Dalam baris 9, kami menyahsiri XML daripada objek pembaca dan mendapatkan objek Cat."

"Sekarang semuanya kelihatan hampir jelas. Tetapi beberapa jam yang lalu, saya memerah otak untuk memikirkan cara ia berfungsi."

"Itu selalu berlaku apabila anda semakin bijak. Perkara yang rumit menjadi mudah."

"Saya semakin bijak? Saya tidak boleh tidak gembira tentang itu."

"Bagus. Kemudian, berikut ialah senarai anotasi yang boleh anda gunakan untuk mengawal hasil siri JAXB:"

Anotasi JAXB Penerangan
@XmlElement(nama) Diletakkan berhampiran padang.
Medan akan disimpan dalam elemen XML.
Membolehkan anda menetapkan nama tag.
@XmlAttribute(nama) Diletakkan berhampiran padang.
Medan akan disimpan sebagai atribut XML!
Membolehkan anda menetapkan nama atribut.
@XmlElementWrapper(tidak boleh = benar) Diletakkan berhampiran padang.
Membolehkan anda menetapkan 'tag pembalut' untuk sekumpulan elemen.
@XmlType Diletakkan berhampiran kelas.
Membolehkan anda menentukan kaedah untuk mencipta objek jika pembina lalai adalah peribadi.
@XmlJavaTypeAdapter Diletakkan berhampiran padang.
Membolehkan anda menentukan kelas yang akan menukar medan kepada rentetan.

"Sungguh menarik! Tetapi bolehkah anda memberikan saya contoh yang menggunakan anotasi ini? Penjelasan adalah satu perkara, tetapi contoh yang berkesan adalah sesuatu yang lain."

"OK. Saya akan tunjukkan satu contoh kepada anda. Saya cuma ingin menambah bahawa JAXB membenarkan anda menganotasi kaedah pengambil/penetap dan bukannya medan."

"Ini contoh yang saya janjikan:"

Tukar objek kepada 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 ditukar kepada 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 siri dan output skrin:
<zoo> 
<haiwan liar> 
<usia harimau = "5" w = "4"> 
<nama kucing>Missy</nama kucing> </tiger> 
< 
tiger age = "5" w = "4"> 
<catname>Missy </catname> 
</tiger> 
</liar-animals> 
</zoo>

"Perhatikan bahawa kali ini kami tidak mensiri objek Kucing, tetapi objek Zoo yang menyimpan koleksi objek Kucing."

"Objek kucing telah ditambahkan pada koleksi dua kali, jadi ia berada dalam XML dua kali."

"Koleksi ini mempunyai tag ' haiwan liar ' sendiri yang membungkus semua elemen koleksi."

" Unsur umur & berat telah menjadi sifat umur & w ."

"Menggunakan atribut @XmlElement , kami menukar tag kucing kepada tag harimau ."

"Perhatikan baris 17. Di sini kita lulus dua kelas ( Zoo dan Cat ) kepada konteks JAXB, kerana kedua-duanya terlibat dalam penyiaran."

"Hari ini adalah hari yang sangat menarik. Banyak maklumat baharu."

"Ya. Saya gembira untuk awak. Sekarang, berehat sekejap dan kita sambung."