2012-03-28 13 views
5

के विभिन्न संस्करणों में मुझे आश्चर्य है कि जेएक्सबी में कक्षा के विभिन्न संस्करणों के लिए कोई समर्थन है या नहीं। इसके बारे में मेरे विचार: xml वर्ग (धारावाहिक मूल्य) की दृढ़ता वस्तु का प्रकार है लेकिन विकास के कारण वर्ग वस्तु को बदला जा सकता है (उदा। कार्यक्षमता को विस्तारित करना)। क्या यह जानने का कोई तरीका है कि कक्षा का कौन सा संस्करण दृढ़ता से संग्रहीत किया जाता है (पढ़ें: xml) केवल JAXB API का उपयोग करके?जेएक्सबी और कक्षा

मेरे लिए कक्षा संस्करण को स्टोर करना सुविधाजनक लगता है - जैसे यह मानक जावा क्रमबद्धता तंत्र (मेरा मतलब serialVersionUID) में किया गया है और विभिन्न संस्करणों के मामले में कक्षा पर एक्सएमएल को मैप करने के लिए कार्यक्षमता प्रदान करता है (उदाहरण के लिए एक्सएमएलएडाप्टर के संस्करण के बारे में जानकारी एक्सएमएल में संग्रहीत वर्ग)। डिफ़ॉल्ट रूप से, यदि xml में और रनटाइम में वर्ग का संस्करण भिन्न होता है - अमान्य क्लास अपवाद को फेंक दें।

उदाहरण:

@XmlRootElement 
@XmlAccessorType(value = XmlAccessType.FIELD) 
public class Test { 

    private Long time; 

    private Test() {}; 
} 

उस समय यह सोचते मिली सेकंड में यूनिक्स समय आ गया है: हम कक्षा टेस्ट के रूप में निम्नानुसार है।

इस कोड को उत्पादन पर जारी किया गया था और इस वर्ग के एक्सएमएल के रूप में डेटाबेस में कायम किया गया था। अगली फिल्म से पता चलता है कि यह समय प्रतिनिधित्व के रूप में लंबे समय तक उपयोग करने के लिए अच्छा विकल्प नहीं था और यह तिथि में बदल गया था:

@XmlRootElement 
@XmlAccessorType(value = XmlAccessType.FIELD) 
public class Test { 

    private Date time; 

    private Test() {}; 
} 

अब दो तरीके हैं - या तो विस्थापित करने के लिए डेटा कायम या एक्सएमएल एडाप्टर जो लंबे समय से संभाल लेंगे लिखने के लिए समय और इसे दिनांक समय पर लागू करें।

यदि हम दूसरा तरीका चुनते हैं तो यह बहुत अच्छा होगा यदि JAXB API क्लास संस्करण प्रदान करता है जो xml में संग्रहीत किया गया था (माना जाता है कि क्लास = 0 संस्करण में कोई वर्ग संस्करण निर्दिष्ट नहीं है) और हम स्पष्ट रूप से कक्षा का नया संस्करण जोड़ते हैं (या तो स्थिर क्षेत्र से एनोटेशन या):

@XmlRootElement 
@XmlAccessorType(value = XmlAccessType.FIELD) 
@XmlClassVersion(value = 1) 
public class Test { 

    private Date time; 

    private Test() {}; 
} 

या

@XmlRootElement 
@XmlAccessorType(value = XmlAccessType.FIELD) 
public class Test { 

    private static final long xmlSerialVersionUID = 1; 

    private Date time; 

    private Test() {}; 
} 

और इस प्रकार JAXB XmlAdapter प्रदान करेगा:

public abstract class XmlAdapter<ValueType,BoundType> { 
    protected XmlAdapter() {} 
    public abstract BoundType unmarshal(ValueType v, long classVersion) throws Exception; 

    public abstract ValueType marshal(BoundType v, long classVersion) throws Exception; 
} 

बेशक, कई संस्करणों का समर्थन करने के लिए, हमें ऐसे एडाप्टर को लागू करने और स्पष्ट रूप से विभिन्न संस्करणों को संभालने की आवश्यकता है। स्पष्ट रूप से, जेएक्सबी एक्सएमएल में कक्षा के बारे में विशेष जानकारी जोड़ देगा और नवीनतम वर्ग संस्करण पर एक्सएमएल उत्पन्न करेगा।

नोट: है कि ऊपर के उदाहरण की बात हम दृढ़ता एक साथ में वर्ग के 2 अलग अभ्यावेदन है, लेकिन अभी भी उन्हें क्रम में उपलब्ध वर्ग के संस्करण के लिए मैप कर सकते हैं।

उत्तर

1

JAXB "XML बाइडिंग के लिए जावा वास्तुकला" के लिए खड़ा है, हां, तो यह बाध्यकारी वस्तुओं XML तत्वों/serializing जावा वस्तुओं जिम्मेदार बताते हैं, और नहीं के बारे में करने के लिए मान-प्रांगण बारे में है। में आप उदाहरण इस article के लिए पढ़ते हैं, आप देखते हैं कि यह कहता है

javax.xml।बाँध, इस तरह के unmarshalling, मार्शलिंग, और मान्यता के रूप में ऑपरेशनों को

जावा वस्तु क्रमबद्धता एक और बात है के लिए कक्षाओं और इंटरफेस शामिल है, और यह serialVersionUID है कि आप अपने प्रश्न में उल्लेख करने के लिए संबंधित है।

+0

लेकिन यदि हम वेब सेवा कार्यान्वयन के रूप में जेएक्स डब्ल्यूएस का उपयोग करते हैं - जेएक्सबी एपीआई = सीरियलाइजेशन एपीआई। क्या यह कथन सही नहीं है? –

+0

जहां तक ​​मुझे पता है, जेएक्स डब्ल्यूएस 'java.io.Serializable' को लागू करने वाले वर्गों के _binding_ को कवर करने के लिए' xjc: serializable' का उपयोग करता है। [जेएक्सबी] (http://www.oracle.com/technetwork/articles/javase/index-140168.html) आलेख देखें और "xjc: serializable" के लिए खोजें। – MarcoS

0

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

संबंधित मुद्दे