2010-01-11 13 views
9

के बीच क्या अंतर है कैस्टर एक्सएमएल और जेएक्सबी बाध्यकारी के बीच क्या अंतर है क्योंकि दोनों एक्सएमएल और इसके विपरीत बाध्यकारी जावा ऑब्जेक्ट हैं।कास्टर एक्सएमएल बाध्यकारी और जेएक्सबी बाध्यकारी

अपडेट किया गया:

केस्टर का उपयोग कर के रूप में मैं इस मान लें packageA.ClassA और packageB.ClassA ही गुण और वर्ग के नाम सिर्फ इतना है कि वे अलग-अलग पैकेज में स्थित थे राशि कर सकते हैं।

packageA.ClassA - > XML -> packageB.ClassA 

JAXB का उपयोग कर अगर मैं वस्तु packageB.ClassA में एक्सएमएल के लिए और एक्सएमएल unmarshall से इस मार्शल वस्तु packageA.ClassA कर रहा हूँ मैं कास्टिंग त्रुटि मिली।

उत्तर

15

कृपया ध्यान दें कि जेएक्सबी एक एपीआई है, और कई कार्यान्वयन उपलब्ध हैं।

सूर्य एक संदर्भ कार्यान्वयन प्रदान करता है और इसे जे 2 ईई के साथ पैकेज करता है (यह जे 2 एसई 1.6 में भी उपलब्ध है)। जेएक्सबी सूर्य से बाहर आने से पहले कास्टर का जन्म हुआ, और कुछ अतिरिक्त सुविधाएं प्रदान करता है। लेकिन यदि आप चाहते हैं कि सादा एक्सएमएल बाध्यकारी है, तो संदर्भ सूर्य कार्यान्वयन महान काम करना चाहिए।

इस पर JavaWorld में एक शानदार article है। थोड़ा पुराना लेकिन अधिकांश विचारों ने समझाया कि अभी भी अच्छा है। और आपको जेएक्सबी एनोटेशन का जिक्र करने वाला आलेख नहीं मिलेगा, जिसने आजकल चीजों को आसान बना दिया है।

सरल बाध्यकारी ढांचे का उपयोग करना आसान है, और न्यूनतम 'सरल' कॉन्फ़िगरेशन के साथ काम करता है।

डोम एक पूरी तरह से अलग अवधारणा है - यह सब पार्सिंग के बारे में है और बाध्यकारी के बारे में कुछ भी नहीं करता है। एक डोम पार्सर का उपयोग करके, आप एक्सएमएल से डेटा खींच सकते हैं। लेकिन यह आपको ऑब्जेक्ट मैपिंग सुविधा नहीं देता है। तो आपको अभी भी डीओएम का उपयोग करके डेटा खींचना होगा, और फिर इस डेटा को जावा ऑब्जेक्ट पर धक्का देने के लिए कोड लिखें।

+0

डीओएम अवधारणा – user236501

+0

@newbie के बारे में स्पष्टीकरण के लिए बहुत धन्यवाद, अगर आपको यह जवाब पसंद है, तो कृपया इसे स्वीकार करने पर विचार करें या कम से कम इसे ऊपर उठाना। धन्यवाद! –

3

आपको क्लास कास्ट अपवाद मिलता है क्योंकि दिया गया JAXBContext इंस्टेंस प्रत्येक रूट एक्सएमएल तत्व नाम को एक बाध्यकारी वर्ग से जोड़ता है।

तो जब आप एक्सएमएल में packageA.ClassA मार्शल करते हैं, और फिर इसे फिर से अनारशल करते हैं, तो परिणाम packageA.ClassA होगा, और आप इसे नहीं डाल सकते हैं।

यदि आप packageB.ClassA पर अनारशल करना चाहते हैं, तो आपको दूसरा JAXBContext बनाना होगा। पहले JAXBContext को packageA.ClassA के बारे में पता है, दूसरा packageB.ClassA के बारे में जानता है। XML के लिए marshalling के लिए पहले का उपयोग करें, दूसरा unmarshalling के लिए। जैसा कि आप उम्मीद करते हैं वह काम करेगा।