ما هي المزايا النسبية ل XMLEncoder و XStream؟

لنفترض أنني أرغب في تخزين العديد من كائنات التكوين الصغيرة في xml ، ولا يهمني كثيرًا حول التنسيق. تضمين XMLDecoder في سيعمل JDK ، وما أسمع منه ، XStream يعمل بطريقة مماثلة.

ما هي مزايا كل مكتبة؟

0
وأضاف تحرير
الآراء: 2

8 إجابة

أجد دائمًا XStream مغريًا جدًا ، لأنه من السهل جدًا البدء. ومع ذلك ، دائمًا ما انتهيت من استبداله. انها حقا عربات التي تجرها الدواب تماما ، ويمكن التعامل مع مجموعة لها استخدام الكثير من العمل.

كنتيجة لذلك ، عادة ما أقوم بالتحول إلى JAXB. إنها أكثر قوة وأكثر قوة ، وهي خالية تمامًا من الأخطاء ، وأكثر مرونة من XStream.

0
وأضاف
ما هي الأخطاء في XStream؟
وأضاف المؤلف Marcus Leon, مصدر

اقتراح آخر: النظر في استخدام JAXB ( http://jaxb.dev.java.net ). إذا كنت تستخدم JDK 1.6 ، فسيكون مجمعًا ، راجع "javax.xml.bind" للحصول على التفاصيل ، لذلك لا حاجة إلى جرار خارجي إضافي.

JAXB سريع نوعًا ما. تعجبني XStream أيضًا ، ولكنها أبطأ قليلاً. أيضا ، XMLEncoder هو جزء من لعبة (مقارنة بخيارات أخرى) ... ولكن إذا كان يعمل ، ليس هناك ضرر في استخدامه.

أيضا: فائدة واحدة من JAXB هو أنه يمكنك أيضا ربط وثيقة جزئية (أشجار فرعية) معها ؛ لا حاجة لإنشاء كائن (كائنات) للملف بأكمله. لهذا تحتاج إلى استخدام Stax (XMLStreamReader) للإشارة إلى عنصر الجذر للشجرة الفرعية ، ثم ربط. لا حاجة إلى استخدام SAX ، حتى بالنسبة لمعظم الملفات الكبيرة ، طالما أنه يمكن معالجتها بالقطعة.

0
وأضاف
شكرا على اقتراحك. أقوم بالتمييز بين الربط والتسلسل ، ويتم توجيه هذا السؤال في التسلسل. ومع ذلك ، فأنت تذكر أن XMLEncoder هي لعبة مقارنة بالآخرين. هل يمكن أن تستشهد ببعض ميزات XStream التي تفتقر إلى XMLEncoder؟
وأضاف المؤلف erickson, مصدر
عادل بما يكفي. إنه فقط في معظم الحالات ، يعمل التسلسل المرتبط بالبيانات على ما يرام. ولم أر أي شيء يشير إلى أن JAXB لن يعمل. لعبة Wrt: عدم قابلية التكوين ، تكتب فقط الفاصوليا (بدون حقل) ، تكامل xml (يستخدم XE سلسلة concat ، وليس كاتب xml) ، والأداء.
وأضاف المؤلف StaxMan, مصدر

إذا كنت تخطط لتخزين كل كائنات التكوين هذه في ملف واحد ، وسيكون هذا الملف كبيرًا إلى حد كبير ، فغالبًا ما تكون الخيارات التي قمت بتحديدها أعلاه ذات ذاكرة كبيرة ، حيث يتطلب كلاهما قراءة الملف بأكمله في الذاكرة أن تدمر.

إذا كان استخدام الذاكرة مصدر قلق (سيكون الملف الذي يحتوي على xml كبيرًا جدًا) ، أوصي بـ SAX .

إذا لم يكن استخدام الذاكرة مصدر قلق (لن يكون الملف الذي يحتوي على xml كبيرًا جدًا) ، فسأستخدم كل ما تم تضمينه مع JRE الافتراضي (في هذه الحالة XMLDecoder) فقط لإزالة تبعيات الطرف الثالث.

0
وأضاف
بيت القصيد هو ، بالتحديد ، تحميل الأشياء في الذاكرة. إنها آلية نزع السلاح. ما أريد تجنبه هو إنشاء DOM ، ثم السير عليه لإنتاج رسم بياني للكائن المتوازي ، لأنني حينئذٍ سيكون لدي اثنين نسخًا في الذاكرة ، دون داعٍ. XMLDecoder ، على الأقل ، هو المستند إلى SAX.
وأضاف المؤلف erickson, مصدر

أفضّل أيضًا XStream نظرًا لأنه سهل الاستخدام والتوسيع. يمكنك البدء بسرعة إذا كنت بصدد الإعداد الافتراضي. إذا كنت بحاجة إلى تخصيص السلوك ، فإنه يحتوي على واجهة برمجة تطبيقات نظيفة جدًا والكثير من نقاط الامتداد ، بحيث يكون لديك تحكم دقيق جدًا في الأشياء التي تريد تعديلها دون التداخل مع أجزاء أخرى من عملية التنظيم.

نظرًا لأن تنسيق xml الذي يتم إنشاؤه بواسطة XStream يبدو رائعًا ، فإن التعديل اليدوي بسيط أيضًا. إذا كان الإخراج لا يفي باحتياجاتك ولا تحتوي القائمة الطويلة لـ محولات المتاحة على الذي تحتاجه ، من البسيط أن تكتب بنفسك.

إضافة كبيرة هي أيضًا المستندات الجيدة في الصفحة الرئيسية .

0
وأضاف

يجب تجنب XMLEncoder/XMLDecoder مثل الطاعون إذا كنت ستستمر في عدد غير عادي من الكائنات أو يحتاج النظام الخاص بك إلى multithreaded. راجع http://matthew.mceachen.us/blog/do -not-want-xmlencoder-129.html للحصول على التفاصيل المروعة.

إذا كان يجب عليك استخدام xml ، فإن XStream رائع. ولكن اسأل نفسك إذا كنت بحاجة إلى استخدام XML. في ما يلي مشروع مرجعي للتسنين يمكن أن يحولك إلى حلول أفضل:

http://code.google.com/p/thrift-protobuf- مقارنة/ويكي/المقارنة المعيارية

0
وأضاف

تحتوي Java أيضًا على فئة أدوات مساعدة جديدة تهدف إلى تخزين مجموعات مقترنة Key-Value نموذجية للتكوينات. إنه النمط القديم ولكنه بسيط للغاية ومفيد. يتم ذلك عبر java.util.Properties class ، كائن Map مع خيارات التسلسل. قد يكون هذا كل ما تحتاج إليه إلا إذا كنت تخزن كائنات كاملة.

0
وأضاف

أود حقًا XStream مكتبة. انها تقوم بعمل جيد حقا لإخراج xml بسيط نسبيا كنتيجة لكائن Java موجود. انها تعمل بشكل جيد للتكاثر الكائن مرة أخرى من xml كذلك. وواحدة من مكتبات الجهات الخارجية التابعة لنا اعتمدت بالفعل على ذلك على أي حال.

  • لقد اخترنا استخدامها لأننا أردنا xml لدينا لتكون قابلة للقراءة الإنسان. عن طريق الدالة الاسم المستعار يجعلها كثيرة أجمل.

    </لى>
  • يمكنك تمديد المكتبة إذا كنت تريد بعض جزء من كائن ل يفر في بطريقة ألطف. نحن فعل هذا في حالة واحدة حتى الملف سيكون لديه مجموعة من الدرجات ، دقائق وثواني لخط العرض وخط الطول ، بدلاً من اثنين الزوجي.

    </لى>

يلخص البرنامج التعليمي الذي يتضمن دقيقتين الاستخدام الأساسي ، ولكن في مصلحة الحفاظ على المعلومات في مكان واحد ، سأحاول أن نلخص ذلك هنا ، أقصر بقليل.

// 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
}

ثم استخدم المكتبة لكتابة xml.

// 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 لتسلسل فاصولياء جافا. آخر مرة استخدمتها ، الملف بدا مقرف إلى حد ما. إذا كنت لا تهتم بمظهر الملف ، فيمكنه ذلك العمل بالنسبة لك ويمكنك تجنب تبعية طرف ثالث ، وهي أيضا لطيفة. كنت أتوقع أن تكون إمكانية جعل التسلسل أجمل تحديًا مع XMLEncoder أيضًا.

تقوم XStream بإخراج اسم الفئة بالكامل إذا لم تكن الاسم المستعار. إذا كانت فئة الشخص المذكورة أعلاه

package example;
the xml would have "example.Person" instead of just "person".
0
وأضاف
الجانب "مقرف" من XMLEncoder ouput هو أساسا اسم فئة مؤهل بالكامل. إذا اخترت عدم إعداد الأسماء المستعارة ، ماذا يفعل XStream بأسماء الحزم؟ لدي العديد من الأنواع ؛ يجب تصغير الكود الخاص بالفئة. كيف يمكنني كتابة XSLT عام لتحويل أي نوع XStreamed إلى ، على سبيل المثال ، JSON؟
وأضاف المؤلف erickson, مصدر
هذا هو الجزء الجيد. JSON يتم إخراجها بالفعل إلى JSON . هل هذا ما تريده؟
وأضاف المؤلف Jorge Ferreira, مصدر
لست متأكدًا من كيفية كتابة XSLT للانتقال من إخراج XStream إلى JSON؟ هل يمكن أن تسأل سؤالا جديدا على SO. :)
وأضاف المؤلف Jay R., مصدر

بالإضافة إلى @ جاي الإجابة مع مثال:

الشفرة:

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
وأضاف