JAXB คืออะไรและทำไมฉันถึงใช้? [ปิด]


109

มีผู้ชายที่นี่สาบานว่า JAXB เป็นสิ่งที่ดีที่สุดตั้งแต่ขนมปังหั่นบาง ๆ ฉันอยากรู้ว่าผู้ใช้ Stack Overflow คิดว่ากรณีการใช้งานมีไว้สำหรับ JAXB และอะไรทำให้เป็นทางออกที่ดีหรือไม่ดีสำหรับกรณีนั้น


2
อ่านบทความนี้ (สถาปัตยกรรม Java สำหรับการผูก XML (JAXB)) นี่เป็นสิ่งที่ดีที่สุด URL: oracle.com/technetwork/articles/javase/index-140168.html#unmars

คำตอบ:


99

ฉันเป็นแฟนตัวยงของ JAXB สำหรับการจัดการ XML โดยทั่วไปจะมีวิธีแก้ปัญหานี้ (ฉันสมมติว่าคุ้นเคยกับ XML โครงสร้างข้อมูล Java และ XML Schemas):

การทำงานกับ XML เป็นเรื่องยาก เราต้องการวิธีที่จะใช้ไฟล์ XML ซึ่งโดยพื้นฐานแล้วเป็นไฟล์ข้อความและแปลงเป็นโครงสร้างข้อมูลบางประเภทซึ่งโปรแกรมของคุณสามารถจัดการได้

JAXB จะใช้ XML Schema ที่คุณเขียนและสร้างชุดของคลาสที่สอดคล้องกับ schema นั้น ยูทิลิตี้ JAXB จะสร้างลำดับชั้นของโครงสร้างข้อมูลสำหรับจัดการ XML นั้น

จากนั้นสามารถใช้ JAXB เพื่ออ่านไฟล์ XML จากนั้นสร้างอินสแตนซ์ของคลาสที่สร้างขึ้น - รับข้อมูลจาก XML ของคุณ JAXB ยังทำการย้อนกลับ: รับคลาส java และสร้าง XML ที่สอดคล้องกัน

ฉันชอบ JAXB เพราะมันใช้งานง่ายและมาพร้อมกับ Java 1.6 (หากคุณใช้ 1.5 คุณสามารถดาวน์โหลด JAXB .jars ได้) วิธีที่สร้างลำดับชั้นของคลาสนั้นใช้งานง่ายและจากประสบการณ์ของฉันก็ทำได้ดี แยก "XML" ออกไปเพื่อที่ฉันจะได้มุ่งเน้นไปที่ "ข้อมูล"

เพื่อตอบคำถามของคุณ: ฉันคาดหวังว่าสำหรับไฟล์ XML ขนาดเล็ก JAXB อาจจะใช้งานมากเกินไป คุณต้องสร้างและดูแลสคีมา XML และใช้ "วิธีการตำรามาตรฐาน" ในการใช้คลาส Java สำหรับโครงสร้างข้อมูล (คลาสหลักคลาสภายในขนาดเล็กเพื่อแสดงถึง "โหนด" และลำดับชั้นขนาดใหญ่ของพวกเขา) ดังนั้น JAXB จึงไม่เหมาะสำหรับรายการ "ค่ากำหนด" เชิงเส้นแบบง่ายๆสำหรับแอปพลิเคชัน

แต่ถ้าคุณมีสคีมา XML ที่ค่อนข้างซับซ้อนและมีข้อมูลมากมายอยู่ภายในนั้น JAXB ก็ยอดเยี่ยมมาก ในโครงการของฉันฉันกำลังแปลงข้อมูลจำนวนมากระหว่างไบนารี (ซึ่งใช้โดยโปรแกรม C) และ XML (เพื่อให้มนุษย์สามารถใช้และแก้ไขข้อมูลนั้นได้) XML Schema ที่ได้นั้นไม่สำคัญ (หลายระดับของลำดับชั้นบางฟิลด์สามารถทำซ้ำได้บางฟิลด์ไม่สามารถทำซ้ำได้) ดังนั้น JAXB จึงมีประโยชน์ในการจัดการกับสิ่งนั้น


21
JAXB สามารถทำได้โดยไม่ต้องใช้ XSD คุณสามารถใช้คำอธิบายประกอบ: jaxb.dev.java.net/guide/Mapping_your_favorite_class.html
codefinger

7
JAXB เป็นข้อมูลจำเพาะ (เช่น JPA หรือ JAXP) ซึ่งหมายความว่ามีการใช้งานหลายอย่าง (Metro, EclipseLink และอื่น ๆ ) หากคุณประสบปัญหาคุณสามารถเปลี่ยนไปใช้การใช้งานอื่นได้ คุณยังสามารถใช้ประโยชน์จากส่วนขยายที่นำเสนอโดยผู้ให้บริการต่างๆ
bdoughan

@BlaiseDoughan เมโทรเป็นการใช้งาน JAXB หรือไม่! Metro ไม่ใช่การใช้งาน WSIT หรือไม่?
Muhammad Gelbana

1
@MuhammadGelbana - ฉันเดาว่าฉันควรเรียกมันว่า Project JAXB ( jaxb.java.net ) ซึ่งเป็นส่วนหนึ่งของ Metro การใช้งาน JAX-WS ( metro.java.net )
bdoughan

2
FYI, JAXB จะถูกลบออกจาก Java SE 11. ดูJEP 320: เอา Java EE และ CORBA โมดูล การดำเนินการนี้ถูกนำมาใช้เป็นส่วนหนึ่งของModularization ของ Java SEและการส่งมอบเทคโนโลยีJava EEให้กับโครงการJakarta EE คุณจะต้องเพิ่ม JAXB API และการนำไปใช้ในโครงการของคุณ
Basil Bourque

23

นี่คือเหตุผลที่จะไม่ใช้: ประสิทธิภาพไม่ดี มีค่าใช้จ่ายที่ดีเมื่อมีการจัดระเบียบและ unmarshaling คุณอาจต้องการพิจารณา API อื่นสำหรับการเชื่อม XML-Object เช่น JiBX: http://jibx.sourceforge.net/


1
ลองพิจารณาใช้เครื่องมือ XSD2Jibx หากคุณมีปัญหาในการผูกซึ่งอยู่ในสถานะ "อัลฟา" แต่การแสดงคลาสและการเชื่อมโยงที่ชอบด้วย XSD schemas นั้นมีประโยชน์มาก ... ตอนนี้หากหยุดใช้วันที่ของ SQL โดยค่าเริ่มต้น และใช้ Java util Date แทน ...
MetroidFan2002

3
พล่าม. JAXB ค่อนข้างเร็วตราบใดที่คุณใช้ตัวแยกวิเคราะห์ที่รวดเร็ว (เช่น Woodstox) ค่าใช้จ่ายอาจจะ 30-40% เมื่อเทียบกับการผูกด้วยตนเอง JiBX ใช้ได้ดีไม่มีปัญหากับมัน แต่ความแตกต่างของประสิทธิภาพไม่มาก
StaxMan

6
ฉันใช้ JAXB ในหลายโปรเจ็กต์และยังคงใช้ต่อไป แต่สิ่งสำคัญคือต้องเข้าใจว่ามันเปรียบเทียบกับกรอบอื่น ๆ อย่างไร หากคุณกำลังจัดเก็บเอกสาร / unmarshaling เอกสารที่มีขนาดหลายร้อยเมกะไบต์และเวลาก็สำคัญ - JiBX เป็นทางเลือกที่ดี JAXB == การสะท้อน, JiBX == เครื่องมือวัดรหัสไบต์
codefinger

19

มันคือ "ORM สำหรับ XML" ส่วนใหญ่มักใช้ร่วมกับ JAX-WS (และแน่นอนว่าการใช้งาน Sun ได้รับการพัฒนาร่วมกัน) สำหรับระบบ WS Death Star


19

ฉันใช้ JAXB ในที่ทำงานตลอดเวลาและฉันรักมันมาก เหมาะอย่างยิ่งสำหรับสกีมา XML ที่ซับซ้อนซึ่งมีการเปลี่ยนแปลงอยู่เสมอและเหมาะอย่างยิ่งสำหรับการเข้าถึงแท็กในไฟล์ XML โดยสุ่ม

ฉันเกลียดแมงดา แต่ฉันเพิ่งเริ่มบล็อกและนี่เป็นสิ่งแรกที่ฉันโพสต์เกี่ยวกับ!

ตรวจสอบได้ที่นี่:

http://arthur.gonigberg.com/2010/04/21/getting-started-with-jaxb/


4
ตัวอย่างที่ชัดเจนในบล็อกของคุณ โหวตขึ้นสำหรับสิ่งนั้น :-)
Shawn D.

9

ด้วย JAXB คุณสามารถสร้างการแสดง XML ของอ็อบเจ็กต์ (มาร์แชลลิ่ง) และการแทนอ็อบเจ็กต์ของ XML (unmarshalling) โดยอัตโนมัติ

เท่าที่เกี่ยวข้องกับ XML Schema คุณมีสองทางเลือก:

  • สร้างคลาส Java จาก XSD
  • สร้าง XSD จากคลาส Java ของคุณ

นอกจากนี้ยังมีไลบรารีการทำให้อนุกรม XML ที่ง่ายกว่าเช่นXStream , DigesterหรือXMLBeansที่อาจเป็นทางเลือกอื่น


1
สิ่งเหล่านี้ไม่ใช่กรอบงานที่มีผลผูกพัน แต่เป็นไลบรารีการทำให้เป็นอนุกรม เฟรมเวิร์กการผูกที่ดีสามารถแมป XML ใด ๆ กับกราฟอ็อบเจ็กต์ไอโซมอร์ฟิคหรือย้อนกลับอีกครั้ง กลไกการทำให้เป็นอนุกรมอย่างง่ายเหล่านี้สร้างและใช้สคีมา XML ที่ไม่ได้มาตรฐานคงที่
erickson

ขอบคุณ erickson ฉันทำงานกับ JAXB เท่านั้นและต้องการให้แน่ใจว่าฉันพูดถึงทางเลือกอื่น ฉันจะแก้ไขคำตอบตามข้อมูลที่คุณป้อน
Fabian Steeg

อันที่จริงในขณะที่ XStream ก็โอเค แต่มันก็ไม่ได้ง่ายไปกว่านั้นเพราะทั้งสองอย่างนั้นง่ายมาก และ Digester ไม่ใช่เรื่องง่าย แต่เป็นเรื่องง่าย
StaxMan

2
มีใครบางคนโปรดพูดถึง JAXB-2.0 โดยใช้คำอธิบายประกอบ ระหว่างคลาส XmlAdapter สองสามคลาสนั้นฉันสามารถแม็พสคีมากับโครงสร้าง Java ที่มีอยู่ได้
Mark Renouf

8

JAXB ดีมากถ้าคุณต้องเขียนโค้ดตามข้อกำหนด XML ภายนอกที่กำหนดเป็น XML schema ( xsd)

ตัวอย่างเช่นคุณมีแอปพลิเคชันการซื้อขายและคุณต้องรายงานการซื้อขายไปยังแอป Uber Lame Trade Reportingและแอปพลิเคชันเหล่านี้ให้คุณultra.xsdดำเนินการต่อไป ใช้$JAVA_HOME/bin/xjcคอมไพเลอร์เพื่อเปลี่ยน XML เป็นคลาส Java จำนวนมาก (เช่นUltraTrade)

จากนั้นคุณสามารถเขียนเลเยอร์อะแดปเตอร์ธรรมดา ๆเพื่อแปลงอ็อบเจกต์การค้าของคุณUltraTradesและใช้JAXBเพื่อรวบรวมข้อมูลไปยัง Ultra-Corp มากง่ายกว่าที่ยุ่งเกี่ยวกับการแปลงการซื้อขายของคุณลงในรูปแบบ XML ของพวกเขา

จุดที่ทุกอย่างพังทลายก็คือเมื่อ Ultra-Corp ไม่ได้ปฏิบัติตามสเป็คของตัวเองจริง ๆ และการซื้อขายpriceที่พวกเขาทำลงไปxsd:floatควรจะแสดงเป็นdouble!


1
นอกจากนี้โปรดทราบว่าคุณสามารถสร้างรหัสได้ก่อน: เริ่มต้นด้วยถั่วสร้างสคีมา iff ที่คุณต้องการ
StaxMan

7

ทำไมเราถึงต้องการ JAXB? คอมโพเนนต์ระยะไกล (เขียนด้วย Java) ของเว็บเซอร์วิสใช้ XML เป็นค่าเฉลี่ยในการแลกเปลี่ยนข้อความระหว่างกัน ทำไมต้องเป็น XML เนื่องจาก XML ถือเป็นตัวเลือกที่มีน้ำหนักเบาในการแลกเปลี่ยนข้อความบนเครือข่ายที่มีทรัพยากร จำกัด บ่อยครั้งที่เราต้องแปลงเอกสาร XML เหล่านี้เป็นวัตถุและในทางกลับกัน เช่น: Simple Java POJO Employee สามารถใช้เพื่อส่งข้อมูลพนักงานไปยังส่วนประกอบระยะไกล (รวมถึงโปรแกรม Java)

class Employee{
 String name;
 String dept;
 ....
}

ควรแปลง Pojo นี้ (Marshall) เป็นเอกสาร XML ดังต่อไปนี้:

<Employee>
  <Name>...</Name>
  <Department>...</Department>
</Employee>

และที่ส่วนประกอบระยะไกลให้กลับไปที่วัตถุ Java จากเอกสาร XML (Un-Marshall)

JAXB คืออะไร?

JAXB เป็นไลบรารีหรือเครื่องมือในการดำเนินการ Marshalling และ UnMarshalling ช่วยให้คุณหายจากอาการปวดหัวนี้ได้ง่ายๆ


4

คุณสามารถตรวจสอบ JIBX ได้เช่นกัน นอกจากนี้ยังเป็นตัวประสานข้อมูล xml ที่ดีมากซึ่งมีความเชี่ยวชาญใน OTA (Open Travel Alliance) และได้รับการสนับสนุนโดยเซิร์ฟเวอร์ AXIS2 หากคุณกำลังมองหาประสิทธิภาพและความเข้ากันได้คุณสามารถตรวจสอบได้:

http://jibx.sourceforge.net/index.html


0

JAXB ให้ประสิทธิภาพที่ดีขึ้นผ่านการปรับแต่งการมาร์แชลเริ่มต้น JAXB กำหนด API ของโปรแกรมเมอร์สำหรับการอ่านและเขียนอ็อบเจ็กต์ Java ไปยังและจากเอกสาร XML ทำให้การอ่านและเขียน XML ง่ายขึ้นผ่าน Java

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.