[java] كيف يمكنني استنساخ كائن جاكس


2 Answers

يجب أن تحاول سيسي-زيك ، والذي يتوفر على سورسيفورج. واحدة من معالمه هو توليد استنساخ () ونسخ البناء.

Question

لدي بعض الكائنات جاكسب (مثبت من التعليمات البرمجية التي تم إنشاؤها من شسد بواسطة جاكسب) التي أحتاج إلى استنساخ. لا يبدو أن فئة جاكسب توفر واجهة للقيام بذلك بسهولة. لا أستطيع أن تحرير تحرير الطبقة ولا يمكن تمديده - لذلك أنا بحاجة إلى إنشاء مساعد / طريقة فائدة للقيام بذلك. ما هو أفضل نهج؟




هذا هو موضوع قديم، ولكن كان لي لإنشاء كائنات نطاق جاكس قابلة للاعتراض أيضا وأعتقد أن تحطيم - أونمارشالينغ ليس هو الحل الأفضل بالتأكيد.

من الناحية المثالية يجب نسخ الكائنات في الذاكرة باستخدام أساليب استنساخ ولدت. هناك مافين المساعد ( مافين-jaxb2-المساعد ) التي يمكنك استخدامها لهذا الغرض.

هذه هي القسم ذي الصلة في ملف مافين pom.xml:

<dependency>
    <groupId>org.jvnet.jaxb2_commons</groupId>
    <artifactId>jaxb2-basics</artifactId>
    <version>0.11.1</version>
</dependency>

...

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <extension>true</extension>
        <schemaDirectory>${basedir}/src/main/xsd</schemaDirectory>
        <bindingDirectory>${basedir}/src/main/xjb</bindingDirectory>
        <args>
            <arg>-Xcopyable</arg>
        </args>
        <plugins>
            <plugin>
                <groupId>org.jvnet.jaxb2_commons</groupId>
                <artifactId>jaxb2-basics</artifactId>
                <version>1.11.1</version>
            </plugin>
        </plugins>
    </configuration>
</plugin>

لاحظ الوسيطة -Xcopyible الذي يولد طريقة استنساخ داخل كل الكائنات.

إذا كنت تستخدم

mvn clean install

لبناء هذا المشروع سوف تولد فئات المجال مع تنفيذ استنساخ.

هذا هو مقتطف من أساليب استنساخ ذات الصلة في واحدة من فئات المجال:

public Object clone() {
    return copyTo(createNewInstance());
}

public Object copyTo(Object target) {
    final CopyStrategy2 strategy = JAXBCopyStrategy.INSTANCE;
    return copyTo(null, target, strategy);
}

يمكنك العثور على مصادر وعينات مشروع أساسيات jaxb2 في هذه الصفحة:

https://github.com/highsource/jaxb2-basics/wiki/Sample-Projects

يمكن تنزيل الإصدارات التي تتضمن أمثلة مفيدة من هنا:

https://github.com/highsource/jaxb2-basics/releases




لقد قمت بتشغيل معايير على حلول مختلفة لاستنساخ كائن جاكس. في ما يلي بعض النتائج:

  1. باستخدام البرنامج المساعد زج-استنساخ مفوكوم يبدو أن الحل الأسرع. انها تتيح فقط كل ما تبذلونه من القطع الأثرية التي تم إنشاؤها Cloneable وتجاوز علنا Object.clone() . لسوء الحظ، هذا لم يجعله في مافين المركزية (بعد).

  2. توليد التحف المسلسل و سيرياليزينغ / ديسيرياليزينغ لهم تيار وهمية هو أبطأ 10x من استخدام آليات الاستنساخ جافا:

    public <T extends Serializable> T clone(T jaxbObject) {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      ObjectOutputStream o = new ObjectOutputStream(out);
      o.writeObject(jaxbObject);
      o.flush();
    
      ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
      ObjectInputStream i = new ObjectInputStream(in);
      return (T) i.readObject();
    }
  3. ويؤدي التحطيم / إزالة الأجسام من جاكسب مرة أخرى إلى أبطأ بمقدار 5 أضعاف من التسلسلات / إزالةها. هذا ما يوحي به حل يكاغانوفيتش :

    public <T extends Serializable> T clone(T jaxbObject) {
      StringWriter xml = new StringWriter();
      JAXB.marshal(jaxbObject, xml);
      StringReader reader = new StringReader(xml.toString());
      return JAXB.unmarshal(reader, jaxbObject.getClass());
    }



Related



Tags

java java   jaxb