XMLEncoder और XStream के सापेक्ष फायदे क्या हैं?

मान लीजिए कि मैं एक्सएमएल में कई छोटी कॉन्फ़िगरेशन ऑब्जेक्ट्स स्टोर करना चाहता हूं, और मुझे प्रारूप के बारे में ज्यादा परवाह नहीं है। XMLDecoder कक्षा में निर्मित जेडीके काम करेगा, और जो मैंने सुना है, XStream इसी तरह से काम करता है।

प्रत्येक पुस्तकालय के फायदे क्या हैं?

0

8 उत्तर

मुझे हमेशा एक्सस्ट्रीम बहुत मोहक लगता है, क्योंकि यह जाना आसान है। हालांकि, हमेशा मैं इसे बदलना समाप्त कर देता हूं। यह वास्तव में काफी छोटी है, और इसका संग्रह हैंडलिंग बहुत सारे काम का उपयोग कर सकता है।

नतीजतन, मैं आमतौर पर जेएक्सबी पर स्विच करता हूं। यह एक बहुत अधिक मजबूत है, यह बहुत अधिक बग-मुक्त है, और एक्सस्ट्रीम से अधिक लचीला है।

0
जोड़ा
एक्सस्ट्रीम में क्या बग हैं?
जोड़ा लेखक Marcus Leon, स्रोत

एक अन्य सुझाव: JAXB का उपयोग करने पर विचार करें ( http://jaxb.dev.java.net )। यदि आप जेडीके 1.6 का उपयोग कर रहे हैं, तो यह बंडल आता है, विवरण के लिए "javax.xml.bind" देखें, इसलिए अतिरिक्त बाहरी जारों की आवश्यकता नहीं है।

जेएक्सबी बल्कि तेज है। मुझे एक्सस्ट्रीम भी पसंद है, लेकिन यह थोड़ा धीमा है। इसके अलावा, एक्सएमएलएनकोडर खिलौना का थोड़ा सा है (अन्य विकल्पों की तुलना में) ... लेकिन अगर यह काम करता है, तो इसका उपयोग करने में कोई हानि नहीं है।

इसके अलावा: जेएक्सबी का एक लाभ यह है कि आप इसके साथ आंशिक दस्तावेज़ (उप-पेड़) भी बांध सकते हैं; पूरी फ़ाइल के लिए ऑब्जेक्ट बनाने की कोई ज़रूरत नहीं है। इसके लिए आपको उप-पेड़ के मूल तत्व को इंगित करने के लिए स्टैक्स (XMLStreamReader) का उपयोग करने की आवश्यकता है, फिर बाध्य करें। सबसे बड़ी फ़ाइलों के लिए भी, SAX का उपयोग करने की आवश्यकता नहीं है, जब तक इसे खंड द्वारा खंडित किया जा सके।

0
जोड़ा
सलाह के लिये धन्यवाद। मैं बाध्यकारी और क्रमबद्धता के बीच एक अंतर बना रहा हूं, और यह प्रश्न धारावाहिकरण पर केंद्रित है। हालांकि, आप उल्लेख करते हैं कि XMLEncoder दूसरों की तुलना में खिलौना है। क्या आप XStLEncoder में एक्सस्ट्रीम की कुछ विशिष्ट विशेषताओं का उल्लेख कर सकते हैं?
जोड़ा लेखक erickson, स्रोत
काफी उचित। यह सिर्फ इतना है कि ज्यादातर मामलों में डेटा-बाइंडिंग आधारित क्रमबद्धता ठीक काम करती है। और मैंने कुछ भी नहीं देखा जो इंगित करता है कि जेएक्सबी काम नहीं करेगा। Wrt खिलौना: कॉन्फ़िगरेशन लापता, केवल बीन्स लिखता है (कोई फ़ील्ड-आधारित नहीं), एक्सएमएल एकीकरण (एक्सई स्ट्रिंग कॉन्सैट का उपयोग करता है, एक्सएमएल लेखक नहीं), प्रदर्शन।
जोड़ा लेखक StaxMan, स्रोत

यदि आप उन सभी कॉन्फ़िगरेशन ऑब्जेक्ट्स को एक फ़ाइल में संग्रहीत करने की योजना बना रहे हैं, और वह फ़ाइल काफी बड़ी होगी, तो ऊपर दिए गए विकल्पों को आप दोनों मेहनत कर सकते हैं, क्योंकि दोनों को पूरी फ़ाइल को स्मृति में पढ़ने की आवश्यकता होती है deserialized हो।

यदि स्मृति उपयोग एक चिंता है (एक्सएमएल युक्त फ़ाइल बहुत बड़ी होगी), तो मैं SAX की अनुशंसा करता हूं।

यदि स्मृति उपयोग कोई चिंता नहीं है (एक्सएमएल युक्त फ़ाइल बहुत बड़ी नहीं होगी), तो मैं तृतीय पक्ष निर्भरताओं को हटाने के लिए डिफ़ॉल्ट जेआरई (इस मामले में XMLDecoder) के साथ जो भी शामिल है उसका उपयोग करता हूं।

0
जोड़ा
ऑब्जेक्ट को स्मृति में लोड करने के लिए, बिल्कुल सही बिंदु है। यह एक deserialization तंत्र है। जो मैं टालना चाहता हूं वह एक डोम का निर्माण कर रहा है, फिर इसे समांतर ऑब्जेक्ट ग्राफ़ बनाने के लिए चल रहा है, क्योंकि तब मेरे पास स्मृति में दो प्रतियां होंगी, अनावश्यक रूप से। XMLDecoder, कम से कम, SAX- आधारित है।
जोड़ा लेखक erickson, स्रोत

मैं XStream को भी पसंद करूंगा क्योंकि यह उपयोग करना और विस्तार करना वास्तव में आसान है। यदि आप डिफ़ॉल्ट सेटअप के साथ जा रहे हैं तो आप जल्दी से शुरू कर सकते हैं। यदि आपको व्यवहार को कस्टमाइज़ करने की आवश्यकता है तो इसमें एक बहुत ही साफ एपीआई और बहुत सारे एक्सटेंशन पॉइंट हैं, इसलिए आप उन चीजों पर वास्तव में अच्छी तरह से गढ़ नियंत्रण कर रहे हैं जिन्हें आप मार्शलिंग प्रक्रिया के अन्य हिस्सों में हस्तक्षेप किए बिना ट्विक करना चाहते हैं।

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

एक बड़ा प्लस भी उनके मुखपृष्ठ पर अच्छा प्रलेखन है।

0
जोड़ा

यदि आप ऑब्जेक्ट्स की एक गैर-तुच्छ संख्या जारी रखने जा रहे हैं या आपके सिस्टम को बहुप्रचारित करने की आवश्यकता है, तो आपको प्लेग की तरह XMLEncoder/XMLDecoder से बचना चाहिए। http://matthew.mceachen.us/blog/do देखें grisly विवरण के लिए -not-want-xmlencoder-129.html

यदि आपको एक्सएमएल का उपयोग करना चाहिए, तो एक्सस्ट्रीम बहुत अच्छा है। लेकिन खुद से पूछें कि क्या आपको वास्तव में एक्सएमएल का उपयोग करने की आवश्यकता है। यहां एक क्रमबद्ध बेंचमार्क प्रोजेक्ट है जो आपको बेहतर समाधानों पर बदल सकता है:

http://code.google.com/p/thrift-protobuf- तुलना/wiki/बेंचमार्किंग

0
जोड़ा

जावा में एक नई यूटिलिटी क्लास भी है जिसका लक्ष्य है कि कॉन्फ़िगरेशन के लिए विशिष्ट कुंजी-वैल्यू जोड़े वाले सेट को स्टोर करना है। यह पुरानी शैली है लेकिन बहुत सरल और आसान है। यह java.util.Properties </के माध्यम से किया जाता है। ए> कक्षा, serialization विकल्पों के साथ एक नक्शा वस्तु। यह तब तक हो सकता है जब तक आप पूरी वस्तुओं को संग्रहित नहीं कर लेते।

0
जोड़ा

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

  • हमने इसका उपयोग करना चुना क्योंकि हम चाहते थे हमारे एक्सएमएल मानव पठनीय होने के लिए। का उपयोग करते हुए उपनाम समारोह इसे बहुत बनाता है अच्छे।

  • यदि आप पुस्तकालय का विस्तार कर सकते हैं किसी वस्तु के कुछ हिस्से को चाहते हैं एक अच्छे फैशन में deserialize। हम यह एक मामले में फाइल तो किया था डिग्री का एक सेट होगा, अक्षांश के लिए मिनट, और सेकंड और दो की बजाय, देशांतर डबल्स।

दो मिनट का ट्यूटोरियल मूल उपयोग को सारांशित करता है, लेकिन इसमें जानकारी को एक स्थान पर रखने का हित, मैं इसे समेटने की कोशिश करूंगा यहाँ, बस थोड़ा छोटा।

// define your classes
public class Person {
  private String firstname;
  private PhoneNumber phone;
 //... constructors and methods
}

public class PhoneNumber {
  private int code;
  private String number;
 //... constructors and methods
}

फिर एक्सएमएल लिखने के लिए लाइब्रेरी का उपयोग करें।

// initial the libray
XStream xstream = new XStream();
xstream.alias("person", Person.class);//elementName, Class
xstream.alias("phone", PhoneNumber.class); 

// make your objects
Person joe = new Person("Joe");
joe.setPhone(new PhoneNumber(123, "1234-456"));

// convert xml
String xml = xstream.toXML(joe);

आप आउटपुट इस तरह दिखेगा:


  Joe
  
    123
    1234-456
  

पीछे जाना:

Person newJoe = (Person)xstream.fromXML(xml);

XMLEncoder जावा बीन serialization के लिए प्रदान किया जाता है। पिछली बार मैंने इसका इस्तेमाल किया था, फ़ाइल काफी बुरा लग रहा था। अगर वास्तव में परवाह नहीं है कि फ़ाइल कैसा दिखता है, तो यह हो सकता है आपके लिए काम करते हैं और आप एक तृतीय पक्ष निर्भरता से बचने के लिए मिलता है, जो भी अच्छा है। मुझे उम्मीद है कि सीरियलाइजेशन सुंदर बनाने की संभावना XMLEncoder के साथ भी एक चुनौती होगी।

यदि आप नाम का उपनाम नहीं करते हैं तो एक्सस्ट्रीम पूर्ण श्रेणी का नाम आउटपुट करता है। यदि उपरोक्त व्यक्ति वर्ग था

package example;
the xml would have "example.Person" instead of just "person".
0
जोड़ा
XMLEncoder ouput का "बुरा" पहलू मुख्यतः पूरी तरह से योग्य क्लासनाम है। यदि मैं उपनाम सेट अप नहीं करना चुनता हूं, तो एक्सस्ट्रीम पैकेज नामों के साथ क्या करता है? मेरे पास कई प्रकार हैं; वर्ग-विशिष्ट कोड को कम किया जाना चाहिए। किसी भी XStreamed प्रकार को बदलने के लिए, जेएसओएन को बदलने के लिए मैं एक सामान्य एक्सएसएलटी कैसे लिखूं?
जोड़ा लेखक erickson, स्रोत
यह एक अच्छा हिस्सा है। जेएसओएन पहले से ही JSON पर आउटपुट । क्या तुम यही चाहते हो?
जोड़ा लेखक Jorge Ferreira, स्रोत
मुझे यकीन नहीं है कि XStream आउटपुट से JSON तक जाने के लिए आप XSLT कैसे लिखेंगे? आप SO पर एक नया सवाल पूछ सकते हैं। :)
जोड़ा लेखक Jay R., स्रोत

उदाहरण के साथ @Jay उत्तर में जोड़ें:

कोड:

PortfolioAlternateIdentifier identifier = new PortfolioAlternateIdentifier();
identifier.setEffectiveDate(new Date());
identifier.setSchemeCode("AAA");
identifier.setIdentifier("123456");

XStream का उपयोग करके आउटपुट:


 2014-05-02 20:14:15.961 IST
 AAA
 123456
   

XMLEncoder का उपयोग करके आउटपुट:

<?xml version="1.0" encoding="UTF-8"?> 
  
    
      1399041855961    123456   AAA   
 
0
जोड़ा