"Không nhanh như vậy thiếu gia! Ta còn có hai tiết học cho ngươi!"

"Hai? Chà. Chà, được rồi. Bạn sẽ không làm gì để nâng cao sự ngầu của mình! Tôi nghe rõ đây."

"XML, giống như JSON, thường được sử dụng khi truyền dữ liệu giữa các chương trình và máy tính khác nhau. Và có một số khung giúp đơn giản hóa rất nhiều cuộc sống của các lập trình viên Java khi làm việc với XML. Hôm nay tôi sẽ giới thiệu với bạn một trong số đó."

"JAXB là một khung đa năng tuyệt vời để làm việc với XML."

JAXB - 1

"JAXB là một phần của JDK, vì vậy bạn không cần tải xuống riêng."

"Trước tiên hãy để tôi chỉ cho bạn một ví dụ về cách sử dụng nó, sau đó chúng ta sẽ phân tích nó. Ví dụ:"

Chuyển đổi một đối tượng sang 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);
}
Một lớp có các đối tượng chuyển đổi thành XML
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}
Kết quả tuần tự hóa và đầu ra màn hình:
<cat> 
<name> Missy </name> 
<age> 5 </age> 
<weight> 4 </weight> 
</cat>

"Vì lý do nào đó, từng dòng một, mã này làm tôi nhớ đến quá trình tuần tự hóa JSON. Các chú thích giống nhau, nhưng JSON sử dụng ObjectMapper và mã này sử dụng Context và Marshaller."

"Yep. Chúng thực sự rất giống nhau. Jackson được mô phỏng theo JAXB. Nhưng JAXB cũng được sao chép từ đâu đó. Bạn không thể phát minh ra thứ gì đó thiên tài từ đầu."

"Có vẻ như vậy."

"OK, đây là những gì đang xảy ra:"

"Trong các dòng 4-7, chúng tôi tạo một đối tượng Cat và điền dữ liệu vào đó."

"Ở dòng 10, chúng ta tạo một đối tượng Writer để viết kết quả."

"Ở dòng 13, chúng tôi tạo 'bối cảnh'. Điều này tương tự với ObjectMapper, nhưng sau đó, hai đối tượng con bổ sung được tạo từ nó. Marshaller dùng để tuần tự hóa và Unmarshaller dùng để giải tuần tự hóa. Có một số khác biệt nhỏ so với Jackson, nhưng không phải vậy về cơ bản không khác nhau."

"Trong dòng 14, chúng tôi tạo một đối tượng Marshaller . Marshalling là một từ đồng nghĩa với tuần tự hóa."

"Ở dòng 15, chúng tôi đặt thuộc tính FORMATTED_OUTPUT thành TRUE. Điều này sẽ thêm dấu ngắt dòng và dấu cách vào kết quả để mã có thể đọc được và không chỉ có tất cả văn bản trên một dòng."

"Trong dòng 17, chúng tôi tuần tự hóa đối tượng."

"Ở dòng 20-21, chúng tôi hiển thị kết quả của việc tuần tự hóa trên màn hình."

"Chú thích @XmlType(name = 'cat&') và @XmlRootElement là gì?"

" @XmlRootElement chỉ ra rằng đối tượng này có thể là 'gốc của cây' của các phần tử XML. Nói cách khác, nó có thể là phần tử cấp cao nhất và có thể chứa tất cả các phần tử khác."

" @XmlType(name = 'cat') chỉ ra rằng lớp này có liên quan đến tuần tự hóa JAXB và cũng chỉ định tên của thẻ XML cho lớp này."

"Được rồi, bây giờ tôi sẽ chỉ cho bạn một ví dụ về giải tuần tự hóa XML:"

Chuyển đổi một đối tượng từ 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);
}
Một lớp có các đối tượng được giải tuần tự hóa từ XML
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}

"Mọi thứ gần giống như với Jackson. Nhưng để đề phòng, tôi sẽ giải thích mọi thứ đang diễn ra ở đây."

"Trong dòng 3, chúng tôi chuyển một chuỗi lưu trữ XML để được giải tuần tự hóa."

"Trong dòng 4, chúng tôi bọc chuỗi XML trong StringReader ."

"Trong dòng 6, chúng tôi tạo một bối cảnh JAXB , mà chúng tôi chuyển danh sách các lớp."

"Trong dòng 7, chúng tôi tạo một Unmarshaller —đối tượng sẽ thực hiện quá trình khử lưu huỳnh."

"Trong dòng 9, chúng tôi giải tuần tự hóa XML từ đối tượng trình đọc và nhận đối tượng Cat."

"Bây giờ mọi thứ dường như đã rõ ràng. Nhưng vài giờ trước, tôi đang vắt óc suy nghĩ xem nó hoạt động như thế nào."

"Điều đó luôn xảy ra khi bạn trở nên thông minh hơn. Những thứ phức tạp trở nên đơn giản."

"Tôi ngày càng thông minh hơn? Tôi không thể không vui vì điều đó."

"Tuyệt. Sau đây là danh sách các chú thích mà bạn có thể sử dụng để kiểm soát kết quả của quá trình tuần tự hóa JAXB:"

Chú thích JAXB Sự miêu tả
@XmlElement(tên) Đặt gần một cánh đồng.
Trường sẽ được lưu trữ trong một phần tử XML.
Cho phép bạn đặt tên của thẻ.
@XmlAttribute(tên) Đặt gần một cánh đồng.
Trường sẽ được lưu trữ dưới dạng thuộc tính XML!
Cho phép bạn đặt tên của thuộc tính.
@XmlElementWrapper(nillable = true) Đặt gần một cánh đồng.
Cho phép bạn đặt 'thẻ bao bọc' cho một nhóm phần tử.
@XmlType Đặt gần một lớp học.
Cho phép bạn chỉ định một phương thức để tạo một đối tượng nếu hàm tạo mặc định là riêng tư.
@XmlJavaTypeAd CHƯƠNG Đặt gần một cánh đồng.
Cho phép bạn chỉ định lớp sẽ chuyển đổi trường thành chuỗi.

"Thật thú vị! Nhưng bạn có thể cung cấp cho tôi một ví dụ sử dụng những chú thích này không? Giải thích là một chuyện, nhưng một ví dụ hoạt động lại là một chuyện khác."

"OK. Tôi sẽ chỉ cho bạn một ví dụ. Tôi chỉ muốn thêm rằng JAXB cho phép bạn chú thích các phương thức getter/setter thay vì các trường."

"Đây là ví dụ mà tôi đã hứa:"

Chuyển đổi một đối tượng sang 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());
}
Một lớp có các đối tượng chuyển đổi thành 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()
 {
 }
}
Kết quả tuần tự hóa và đầu ra màn hình:
<zoo> 
<wild-animals> 
<tiger age="5" w="4"> 
<catname>Tiểu thư</catname> 
</tiger> 
<tiger age="5" w="4"> 
<catname>Tiểu thư </catname> 
</tiger> < 
/động vật hoang dã 
> </zoo>

"Lưu ý rằng lần này chúng tôi không tuần tự hóa một đối tượng Cat, mà là một đối tượng Zoo lưu trữ một bộ sưu tập các đối tượng Cat."

"Đối tượng con mèo đã được thêm vào bộ sưu tập hai lần, vì vậy nó có trong XML hai lần."

"Bộ sưu tập có thẻ ' động vật hoang dã ' riêng bao bọc tất cả các yếu tố của bộ sưu tập."

" Các yếu tố tuổi & cân nặng đã trở thành thuộc tính tuổi &w w."

"Sử dụng thuộc tính @XmlElement , chúng tôi đã thay đổi thẻ mèo thành thẻ hổ ."

"Hãy chú ý đến dòng 17. Ở đây chúng tôi chuyển hai lớp ( ZooCat ) vào bối cảnh JAXB, vì cả hai đều tham gia vào quá trình tuần tự hóa."

"Hôm nay là một ngày rất thú vị. Rất nhiều thông tin mới."

"Vâng. Tôi mừng cho bạn. Bây giờ, hãy nghỉ ngơi một chút và chúng ta sẽ tiếp tục."