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

"JAXB เป็นส่วนหนึ่งของ JDK ดังนั้นคุณไม่จำเป็นต้องดาวน์โหลดแยกต่างหาก"
"ก่อนอื่นให้ฉันแสดงตัวอย่างวิธีการใช้งาน จากนั้นเราจะวิเคราะห์ ตัวอย่างเช่น:"
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);
}
@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:"
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);
}
@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 แทนฟิลด์"
"นี่คือตัวอย่างที่ฉันสัญญา:"
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());
}
@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 เนื่องจากทั้งสองคลาสเกี่ยวข้องกับการทำให้เป็นอันดับ"
"วันนี้เป็นวันที่น่าสนใจมาก ข้อมูลใหม่มากมาย"
“ครับ ผมดีใจกับคุณด้วย ตอนนี้พักสักครู่ แล้วเราจะไปกันต่อ”
GO TO FULL VERSION