سؤال

ما هو نظير Java لتسلسل XML الخاص بـ .NET؟

هل كانت مفيدة؟

المحلول

إجابة 2008واجهة برمجة تطبيقات Java "الرسمية" لهذا هي الآن JAXB - Java API for XML Binding.يرى البرنامج التعليمي من أوراكل.التنفيذ المرجعي يعيش في http://jaxb.java.net/

تحديث 2018 لاحظ أن تم إهمال وحدات Java EE وCORBA في SE في JDK9 وستتم إزالتها من SE في JDK11.ولذلك، لاستخدام JAXB، فإنه سيحتاج إما إلى أن يكون في بيئة فئة المؤسسات الموجودة لديك والتي تم تجميعها بواسطة نظامك على سبيل المثال.خادم التطبيق، أو ستحتاج إلى إحضاره يدويًا.

نصائح أخرى

XStream جيد جدًا في إجراء تسلسل للكائن إلى XML بدون الكثير من التكوين والمال!(إنه تحت ترخيص BSD).

استخدمناها في أحد مشاريعنا لاستبدال تسلسل جافا القديم البسيط وقد نجحت تقريبًا خارج الصندوق.

مشروع "تسلسل XML البسيط".

قد ترغب في إلقاء نظرة على تسلسل XML بسيط مشروع.إنه أقرب شيء وجدته إلى System.Xml.Serialization في .Net.

JAXB جزء من الإصدار القياسي JDK الإصدار 1.6+.اذا هي كذلك FREE ولا توجد مكتبات إضافية للتنزيل والإدارة.يمكن العثور على مثال بسيط هنا

يبدو أن XStream قد مات.آخر تحديث كان في 6 ديسمبر 2008.Simple يبدو الأمر سهلاً وأبسط مثل JAXB ولكن لم أتمكن من العثور على أي معلومات ترخيص لتقييمه للاستخدام المؤسسي.

تجدر الإشارة إلى أنه منذ الإصدار 1.4، كانت Java تحتوي على الفئتين java.beans.XMLEncoder وjava.beans.XMLDecoder.تقوم هذه الفئات بتنفيذ تشفير XML والذي يمكن مقارنته على الأقل بتسلسل XML وفي بعض الظروف قد يقوم بالمهمة نيابةً عنك.

إذا التزم فصلك بمواصفات JavaBeans الخاصة بالحروف والمحددات الخاصة بها، فهذه الطريقة سهلة الاستخدام ولا تحتاج إلى مخطط.مع التحذيرات التالية:

  • كما هو الحال مع تسلسل جافا العادي
    • يتم تشغيل التشفير وفك التشفير عبر InputStream وOutputStream
    • تستخدم العملية طريقتي writeObject وreadObject المألوفتين
  • على النقيض من تسلسل جافا العادي
    • يؤدي التشفير وفك التشفير أيضًا إلى استدعاء المُنشئين والمهيئين
    • يعمل التشفير وفك التشفير بغض النظر عما إذا كان فصلك يطبق إمكانية التسلسل أم لا
    • لا تؤخذ المعدلات العابرة بعين الاعتبار
    • يعمل فقط للفئات العامة التي لديها منشئون عامون

على سبيل المثال، خذ التصريح التالي:

public class NPair {
  public NPair() { }
  int number1 = 0;
  int number2 = 0;
  public void setNumber1(int value) { number1 = value;}
  public int getNumber1() { return number1; }
  public void setNumber2(int value) { number2 = value; }
  public int getNumber2() {return number2;}
}

تنفيذ هذا الكود:

NPair fe = new NPair();
fe.setNumber1(12);
fe.setNumber2(13);
FileOutputStream fos1 = new FileOutputStream("d:\\ser.xml");
java.beans.XMLEncoder xe1 = new java.beans.XMLEncoder(fos1);
xe1.writeObject(fe);
xe1.close();

سينتج الملف التالي:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_02" class="java.beans.XMLDecoder">
 <object class="NPair">
  <void property="number1">
   <int>12</int>
  </void>
  <void property="number2">
   <int>13</int>
  </void>
 </object>
</java>

XMLBeans يعمل بشكل رائع إذا كان لديك مخطط لـ XML الخاص بك.يقوم بإنشاء كائنات Java للمخطط وينشئ طرق تحليل سهلة الاستخدام.

إذا كنت تتحدث عن تسلسل XML التلقائي للكائنات، فراجع ذلك الخروع:

Castor هو إطار ربط بيانات مفتوح المصدر لـ Java[tm].إنه أقصر مسار بين كائنات Java ومستندات XML والجداول العلائقية.يوفر Castor ربط Java إلى XML واستمرارية Java إلى SQL والمزيد.

عادة ما أستخدم com.jaxb أو XMLBeans إذا كنت بحاجة إلى إنشاء كائنات قابلة للتسلسل إلى XML.الآن، أستطيع أن أرى ذلك XStream قد يكون مفيدًا جدًا لأنه غير تدخلي ويحتوي على واجهة برمجة تطبيقات بسيطة حقًا.سألعب بها قريبًا وربما أستخدمها.العيب الوحيد الذي لاحظته هو أنني لا أستطيع إنشاء معرف الكائن بمفردي من أجل الإسناد الترافقي.

@ باراك شيلر
شكرًا لنشر الرابط إلى XStream!

لا تنسى JiBX.

إذا كنت تريد أ حل منظم (مثل ORM) فإن JAXB2 يعد حلاً جيدًا.

إذا كنت تريد تسلسلًا مثل DOT NET فيمكنك استخدامه استمرارية مكونات JavaBeans على المدى الطويل

يعتمد الاختيار على استخدام التسلسل.

public static String genXmlTag(String tagName, String innerXml, String properties )
{
    return String.format("<%s %s>%s</%s>", tagName, properties, innerXml, tagName);
}

public static String genXmlTag(String tagName, String innerXml )
{
    return genXmlTag(tagName, innerXml, "");
}

public static <T> String serializeXML(List<T> list)
{
    String result = "";
    if (list.size() > 0)
    {
        T tmp = list.get(0);
        String clsName = tmp.getClass().getName();
        String[] splitCls = clsName.split("\\.");
        clsName = splitCls[splitCls.length - 1];
        Field[] fields = tmp.getClass().getFields();

        for (T t : list)
        {
            String row = "";
            try {
                for (Field f : fields)
                {
                    Object value = f.get(t);
                    row += genXmlTag(f.getName(), value == null ? "" : value.toString());
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            row = genXmlTag(clsName, row);

            result += row;
        }
    }

    result = genXmlTag("root", result);
    return result;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top