"Được rồi. Như bạn có thể đã đoán, đó không phải là tất cả."

"Bây giờ tôi sẽ kể cho bạn nghe về một số khía cạnh khác của JAXB. Nhưng như chúng ta đã làm với JSON, chúng ta sẽ bắt đầu với các tập hợp."

"Khi giải tuần tự hóa các bộ sưu tập bằng cách sử dụng JAXB, cũng có sự không chắc chắn về bộ sưu tập cụ thể nào (ArrayList, LinkedList, Vector, v.v.) sẽ sử dụng cho biến Danh sách. Và một lần nữa, câu trả lời cho câu hỏi này được cung cấp bởi các chú thích."

"Tất cả đều khá đơn giản. Nếu loại bộ sưu tập không được chỉ định trong chú thích của nó, thì JAXB sẽ cố gắng chọn bộ sưu tập thích hợp nhất bằng cách sử dụng loại của nó. Đối với Danh sách, đây sẽ là ArrayList; đối với Bản đồ, nó sẽ là HashMap, v.v. ."

"Trong thực tế, có ít vấn đề hơn ở đây so với JSON, bởi vì mỗi lớp có một thẻ duy nhất và bạn có thể sử dụng thẻ để chỉ định lớp chính xác."

"Ví dụ: nếu bạn cần giải tuần tự hóa một nhóm phần tử kế thừa tổ tiên chung, bạn sử dụng  chú thích @XmlAny: "

Chuyển đổi một đối tượng từ XML
public static void main(String[] args) throws JAXBException
{
 String xmldata = "<zoo><cat/><cat/><dog/><cat/></zoo>";
 StringReader reader = new StringReader(xmldata);

 JAXBContext context = JAXBContext.newInstance(Cat.class, Zoo.class, Dog.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 = "zoo") 
@XmlRootElement 
class  Zoo 
{ 
@XmlAny Danh sách công khai  <Object> động vật; } 
 


@XmlType(name = "cat") 
@XmlRootElement 
class  Cat 
{ 
public  String name; tuổi int công cộng  ; công  int trọng lượng; 
 
 

 con mèo () 
 { 
 } 
}

@XmlType(name = "dog") 
@XmlRootElement 
class  Dog 
{ 
public  String name; tuổi int công khai  ; công  int trọng lượng; 
 
 

 con mèo () 
 { 
 } 

"Nếu một bộ sưu tập được đánh dấu bằng chú thích @XmlAny , thì bất kỳ đối tượng phù hợp nào cũng có thể được đưa vào đó. Và JAXB Unmarshaller chú ý đến các thẻ khi điền vào bộ sưu tập."

"Trong trường hợp này, chuỗi thẻ " <zoo> <cat/><cat/> <dog/> <cat/> </zoo> " sẽ được chuyển đổi thành một bộ sưu tập với các đối tượng Cat, Cat, Dog và Cat ."

"Đó là về những gì tôi mong đợi."

"Uh-huh. Ồ, nhân tiện, còn một điều nữa. Nếu bạn giải tuần tự hóa hỗn hợp văn bản và thẻ, bạn cần sử dụng chú thích @XmlMixed ."

"Đây là một ví dụ về loại XML này:"

XML mẫu yêu cầu chú thích @XmlMixed
<data> 
<items> 
kiểm tra 1 <item/> văn bản 2 <item> tên </item> văn bản 3 </items> </data> 

 

 

 

"Chà. Tôi đã quên rằng XML như vậy tồn tại. Tôi đã quen với việc mọi thứ đều đẹp đẽ, với các thẻ được nhúng và mọi thứ khác."

"Nó tồn tại. Và JAXB có một chú thích ngay cả đối với trường hợp này!"

"Tuyệt. Nhân tiện, tôi muốn hỏi: enums được đánh số theo thứ tự như thế nào?"

"Câu hỏi hay! Câu hỏi hay! Bằng cách nào đó tôi đã bỏ qua chủ đề đó."

"Có một chú thích @XmlEnum đặc biệt phải được sử dụng để đánh dấu các enum. Bạn có thể sử dụng chú thích này để chỉ định liệu các giá trị sẽ được lưu dưới dạng số hay chuỗi."

"Ngoài ra còn có một chú thích @XmlEnumValue cho phép bạn chỉ định giá trị sẽ tương ứng với một trường enum cụ thể."

"Đây là một số ví dụ:"

số Dây
@XmlType
@XmlEnum(Integer.class)
public enum Code
{
 @XmlEnumValue("1")
  START,

 @XmlEnumValue("2")
  INPROGRESS,

 @XmlEnumValue("3")
  FINISH

 @XmlEnumValue("-1")
  ERROR
}
@XmlType
@XmlEnum(String.class)
public enum Card
{
 @XmlEnumValue("Spade")
  CLUBS,

 @XmlEnumValue("Diamond")
  DIAMONDS,

 @XmlEnumValue("Heart")
  HEARTS,

 @XmlEnumValue("Club")
  SPADES
}

"Holy moly. Tôi không thể tưởng tượng được tôi sẽ cần cái này ở đâu, nhưng tôi nghĩ nó rất hữu ích. Và quan trọng nhất, tôi không cần phải tuân theo các giá trị số hoặc chuỗi tiêu chuẩn."

"Vâng. Điều này rất hữu ích, chẳng hạn như khi bạn viết một chương trình trao đổi tin nhắn với máy chủ Facebook chẳng hạn và chúng có một bộ giá trị được chỉ định. Bạn chỉ cần gán chúng cho enum của chính chúng và mọi thứ sẽ hoạt động. "

"Thật tuyệt vời. Tôi chắc chắn thích JAXB."

"Tuyệt. Vậy thì hôm nay thôi. Đi nghỉ đi."