“โอเค อย่างที่คุณน่าจะเดาได้แล้วว่านั่นไม่ใช่ทั้งหมด”

"ตอนนี้ฉันจะบอกคุณเกี่ยวกับแง่มุมอื่นๆ ของ JAXB แต่อย่างที่เราทำกับ JSON เราจะเริ่มต้นด้วยการรวบรวม"

"เมื่อ deserializing คอลเล็กชันโดยใช้ JAXB ยังมีความไม่แน่นอนเกี่ยวกับคอลเล็กชันเฉพาะ (ArrayList, LinkedList, Vector ฯลฯ) ที่จะใช้สำหรับตัวแปร List และอีกครั้งที่คำตอบสำหรับคำถามนี้มีให้โดยคำอธิบายประกอบ"

"ทุกอย่างค่อนข้างเรียบง่ายหากไม่ได้ระบุประเภทคอลเล็กชันไว้ในคำอธิบายประกอบ JAXB จะพยายามเลือกคอลเล็กชันที่เหมาะสมที่สุดโดยใช้ประเภทสำหรับรายการ จะเป็น ArrayList สำหรับแผนที่ จะเป็น HashMap เป็นต้น "

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

"ตัวอย่างเช่น ถ้าคุณต้องการยกเลิกการซีเรียลไลซ์กลุ่มขององค์ประกอบที่สืบทอดบรรพบุรุษร่วมกัน ให้ใช้  @XmlAny: annotation"

แปลงวัตถุจาก 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);
}
คลาสที่มีออบเจกต์ถูกแยกซีเรียลไลซ์จาก XML
@XmlType(name = "zoo") 
@XmlRootElement 
class  Zoo 
{ 
@XmlAny รายการ สาธารณะ  <Object> สัตว์; } 
 


@XmlType(name = "cat") 
@XmlRootElement 
class  Cat 
{ 
 ชื่อสตริงสาธารณะ ;  อายุสาธารณะ ;  น้ำหนัก int สาธารณะ ; 
 
 

 แมว () 
 { 
 } 
}

@XmlType(name = "dog") 
@XmlRootElement 
class  Dog 
{ 
 ชื่อสตริงสาธารณะ ;  อายุสาธารณะ ;  น้ำหนัก int สาธารณะ ; 
 
 

 แมว () 
 { 
 } 

"หากคอลเลกชันถูกทำเครื่องหมายด้วย คำอธิบาย ประกอบ @XmlAnyก็สามารถใส่วัตถุใดๆ ที่เหมาะสมลงไปได้ และ JAXB Unmarshallerจะให้ความสำคัญกับแท็กเมื่อสร้างคอลเลกชัน"

"ในกรณีนี้ ลำดับของแท็ก " <zoo> <cat/><cat/> <dog/> <cat/> </zoo> " จะถูกแปลงเป็นคอลเลกชันที่มีวัตถุ Cat, Cat, Dog และ Cat "

"นั่นคือสิ่งที่ฉันคาดหวัง"

"อ๊ะ อ้อ อีกเรื่องหนึ่ง หากคุณยกเลิกการซีเรียลไลซ์ข้อความและแท็กผสมกัน คุณต้องใช้คำอธิบายประกอบ@XmlMixed "

"นี่คือตัวอย่างของ XML ประเภทนี้:"

XML ตัวอย่างที่ต้องการคำอธิบายประกอบ @XmlMixed
<data> 
<items> 
ทดสอบ 1 <item/> ข้อความ 2 <item> ชื่อ </item> ข้อความ 3 </items> </data> 

 

 

 

"ว้าว ฉันลืมไปเลยว่ามี XML แบบนี้อยู่ ฉันเคยชินกับทุกสิ่งที่สวยงาม แท็กแบบฝัง และอื่นๆ อีกมากมาย"

"มันมีอยู่จริง และ JAXB ก็มีคำอธิบายประกอบสำหรับกรณีนี้ด้วย!"

"เยี่ยมมาก ฉันอยากจะถามว่า enums ได้รับการทำให้เป็นอนุกรมอย่างไร"

"เป็นคำถามที่ดี! น่าสนใจดี! ฉันข้ามหัวข้อนั้นไป"

"มีคำอธิบายประกอบ @XmlEnum พิเศษที่ต้องใช้เพื่อทำเครื่องหมาย enums คุณสามารถใช้เพื่อระบุว่าค่าจะถูกจัดเก็บเป็นตัวเลขหรือสตริง"

"นอกจากนี้ยังมีคำอธิบายประกอบ @XmlEnumValue ที่ให้คุณระบุค่าที่จะสอดคล้องกับฟิลด์ enum เฉพาะ"

"นี่คือตัวอย่างบางส่วน:"

ตัวเลข สตริง
@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 ฉันนึกไม่ออกว่าต้องใช้สิ่งนี้ที่ไหน แต่ฉันคิดว่ามันมีประโยชน์มาก และที่สำคัญที่สุดคือ ฉันไม่ต้องยึดติดกับสตริงมาตรฐานหรือค่าตัวเลข"

"ใช่ สิ่งนี้มีประโยชน์ ตัวอย่างเช่น เมื่อคุณเขียนโปรแกรมที่แลกเปลี่ยนข้อความกับเซิร์ฟเวอร์ของ Facebook และพวกเขาก็มีชุดค่าที่กำหนด คุณเพียงแค่กำหนดให้กับ enum ของตัวเอง แล้วทุกอย่างก็จะทำงาน "

"มันยอดเยี่ยมมาก ฉันชอบ JAXB อย่างแน่นอน"

"ดี งั้นก็แค่นี้สำหรับวันนี้ ไปพักเถอะ"