“ไม่เร็วนัก พ่อหนุ่ม! ฉันมีอีกสองบทเรียนให้นาย!”

"สอง? ว้าว โอเค คุณจะไม่ทำอะไรเพื่อเสริมความเท่ห์ให้ตัวเองบ้าง! ฉันหูฝาด"

"XML เช่น JSON มักใช้เมื่อส่งข้อมูลระหว่างโปรแกรมต่างๆ และคอมพิวเตอร์ และมีหลายเฟรมเวิร์กที่ทำให้ชีวิตของโปรแกรมเมอร์ Java ง่ายขึ้นมากเมื่อทำงานกับ XML วันนี้ฉันจะแนะนำคุณให้รู้จักกับหนึ่งในนั้น"

"JAXB เป็นกรอบอเนกประสงค์ที่ยอดเยี่ยมสำหรับการทำงานกับ XML"

แจ็กซ์บี - 1

"JAXB เป็นส่วนหนึ่งของ JDK ดังนั้นคุณไม่จำเป็นต้องดาวน์โหลดแยกต่างหาก"

"ก่อนอื่นให้ฉันแสดงตัวอย่างวิธีการใช้งาน จากนั้นเราจะวิเคราะห์ ตัวอย่างเช่น:"

แปลงวัตถุเป็น 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);
}
คลาสที่วัตถุแปลงเป็น XML
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}
ผลการทำให้เป็นอันดับและเอาต์พุตหน้าจอ:
<cat> 
<ชื่อ > Missy </name> 
<อายุ> 5 </age> 
<น้ำหนัก> 4 </weight> 
</cat>

"ด้วยเหตุผลบางอย่าง บรรทัดต่อบรรทัด รหัสนี้ทำให้ฉันนึกถึงการทำให้เป็นอนุกรม JSON คำอธิบายประกอบเดียวกัน แต่ JSON ใช้ ObjectMapper และสิ่งนี้ใช้ Context และ Marshaller"

“ใช่ พวกเขาคล้ายกันมากจริงๆ แจ็คสันมีต้นแบบมาจาก JAXB แต่ JAXB ก็ลอกแบบมาจากที่ไหนสักแห่งด้วย คุณไม่สามารถประดิษฐ์สิ่งที่เป็นอัจฉริยะตั้งแต่เริ่มต้นได้”

"ดูเหมือนว่าจะเป็นอย่างนั้น"

"ตกลง นี่คือสิ่งที่เกิดขึ้น:"

"ในบรรทัดที่ 4-7 เราสร้าง วัตถุ Catและเติมข้อมูล"

"ในบรรทัดที่ 10 เราสร้างวัตถุ Writer เพื่อเขียนผลลัพธ์"

"ในบรรทัดที่ 13 เราสร้าง 'บริบท' ซึ่งคล้ายกับ ObjectMapper แต่จากนั้นจะมีการสร้างวัตถุย่อยเพิ่มเติมอีก 2 รายการMarshallerใช้สำหรับซีเรียลไลเซชัน และUnmarshallerใช้สำหรับดีซีเรียลไลเซชัน มีความแตกต่างเล็กน้อยจากแจ็คสัน แต่มันไม่ใช่ ไม่แตกต่างกันโดยพื้นฐาน"

"ในบรรทัดที่ 14 เราสร้าง วัตถุ Marshaller Marshalling เป็นคำพ้องความหมายสำหรับการทำให้เป็นอนุกรม"

"ในบรรทัดที่ 15 เราตั้งค่าคุณสมบัติ FORMATTED_OUTPUT เป็น TRUE ซึ่งจะเพิ่มการขึ้นบรรทัดใหม่และการเว้นวรรคให้กับผลลัพธ์ เพื่อให้โค้ดนั้นมนุษย์สามารถอ่านได้ และไม่ได้มีแค่ข้อความทั้งหมดในบรรทัดเดียว"

"ในบรรทัดที่ 17 เราทำให้วัตถุเป็นอนุกรม"

"ในบรรทัดที่ 20-21 เราแสดงผลของการทำให้เป็นอนุกรมบนหน้าจอ"

"คำอธิบายประกอบ @XmlType(name = 'cat&') และ @XmlRootElement คืออะไร"

" @XmlRootElementบ่งชี้ว่าวัตถุนี้สามารถเป็น 'รากของต้นไม้' ขององค์ประกอบ XML กล่าวอีกนัยหนึ่ง มันสามารถเป็นองค์ประกอบระดับสูงสุด และสามารถมีองค์ประกอบอื่นๆ ทั้งหมด"

" @XmlType(name = 'cat')ระบุว่าคลาสนั้นเกี่ยวข้องกับการทำให้เป็นอนุกรม JAXB และยังระบุชื่อแท็ก XML สำหรับคลาสนี้ด้วย"

"เอาล่ะ ตอนนี้ฉันจะแสดงตัวอย่าง XML deserialization:"

แปลงวัตถุจาก 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);
}
คลาสที่มีออบเจกต์ถูกแยกซีเรียลไลซ์จาก XML
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}

“ทุกอย่างเกือบจะเหมือนกันกับแจ็คสัน แต่เผื่อไว้ ฉันจะอธิบายทุกอย่างที่เกิดขึ้นที่นี่”

"ในบรรทัดที่ 3 เราส่งสตริงที่เก็บ XML ที่จะแยกซีเรียลไลซ์"

"ในบรรทัดที่ 4 เรารวมสตริง XML ในStringReader "

"ในบรรทัดที่ 6 เราสร้างบริบท JAXBซึ่งเราส่งรายชื่อคลาสไปให้"

"ในบรรทัดที่ 7 เราสร้าง Unmarshaller ซึ่งเป็นวัตถุที่จะดำเนินการแยกซีเรียลไลเซชัน"

"ในบรรทัดที่ 9 เรา deserialize XML จากอ็อบเจกต์ reader และรับอ็อบเจกต์ Cat"

"ตอนนี้ดูเหมือนเกือบจะชัดเจนแล้ว แต่เมื่อสองสามชั่วโมงก่อน ฉันใช้สมองอย่างหนักเพื่อคิดว่ามันทำงานอย่างไร"

"สิ่งนี้จะเกิดขึ้นเสมอเมื่อคุณฉลาดขึ้น เรื่องที่ซับซ้อนจะกลายเป็นเรื่องง่าย"

"ฉันฉลาดขึ้น? ฉันอดไม่ได้ที่จะมีความสุขกับสิ่งนั้น"

"เยี่ยมมาก ต่อไปนี้คือรายการคำอธิบายประกอบที่คุณสามารถใช้เพื่อควบคุมผลลัพธ์ของการทำให้เป็นอนุกรม JAXB:"

คำอธิบายประกอบ JAXB คำอธิบาย
@XmlElement(ชื่อ) วางไว้ใกล้สนาม.
ฟิลด์จะถูกเก็บไว้ในองค์ประกอบ XML
ให้คุณตั้งชื่อแท็ก
@XmlAttribute(ชื่อ) วางไว้ใกล้สนาม.
เขตข้อมูลจะถูกเก็บไว้เป็นแอตทริบิวต์ XML!
ให้คุณตั้งชื่อแอตทริบิวต์
@XmlElementWrapper(nillable = จริง) วางไว้ใกล้สนาม.
ให้คุณตั้งค่า 'wrapper tag' สำหรับกลุ่มขององค์ประกอบ
@XmlType วางไว้ใกล้ชั้นเรียน
ให้คุณระบุเมธอดสำหรับสร้างออบเจกต์หากคอนสตรัคเตอร์ดีฟอลต์เป็นแบบส่วนตัว
@XmlJavaTypeAdapter วางไว้ใกล้สนาม.
ให้คุณระบุคลาสที่จะแปลงฟิลด์เป็นสตริง

"น่าสนใจจัง! แต่คุณช่วยยกตัวอย่างที่ใช้คำอธิบายประกอบเหล่านี้ให้ฉันได้ไหม คำอธิบายก็เรื่องหนึ่ง แต่ตัวอย่างที่ใช้ได้จริงก็เป็นอีกเรื่องหนึ่ง"

"ตกลง ฉันจะแสดงตัวอย่างให้คุณดู ฉันแค่อยากจะบอกว่า JAXB ให้คุณใส่คำอธิบายประกอบเมธอด getter/setter แทนฟิลด์"

"นี่คือตัวอย่างที่ฉันสัญญา:"

แปลงวัตถุเป็น 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());
}
คลาสที่วัตถุแปลงเป็น 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()
 {
 }
}
ผลการทำให้เป็นอันดับและเอาต์พุตหน้าจอ:
<zoo> 
<สัตว์ป่า> 
<tiger age = "5" w = "4"> 
<catname>Missy</catname> 
</tiger> 
<tiger age = "5" w = "4"> 
<catname>Missy </catname> 
</tiger> 
</wild-animals> 
</zoo>

"โปรดสังเกตว่าคราวนี้เราไม่ได้ทำให้วัตถุ Cat เป็นอนุกรม แต่เป็นวัตถุ Zoo ที่จัดเก็บคอลเลกชันของวัตถุ Cat"

"วัตถุ cat ถูกเพิ่มไปยังคอลเลกชันสองครั้ง ดังนั้นมันจึงอยู่ใน XML สองครั้ง"

"คอลเลกชั่นนี้มีแท็ก ' สัตว์ป่า ' เป็นของตัวเองซึ่งล้อมรอบองค์ประกอบทั้งหมดของคอลเลกชั่นนี้"

" องค์ประกอบ อายุและน้ำหนักกลายเป็น แอตทริบิวต์ อายุ &w w"

"การใช้ แอตทริบิวต์ @XmlElementเราเปลี่ยนแท็ก cat เป็นแท็กเสือ "

"ให้ความสนใจกับบรรทัดที่ 17 ที่นี่เราส่งสองคลาส ( ZooและCat ) ไปยังบริบท JAXB เนื่องจากทั้งสองคลาสเกี่ยวข้องกับการทำให้เป็นอันดับ"

"วันนี้เป็นวันที่น่าสนใจมาก ข้อมูลใหม่มากมาย"

“ครับ ผมดีใจกับคุณด้วย ตอนนี้พักสักครู่ แล้วเราจะไปกันต่อ”