Как я клонирую объект JAXB - PullRequest
9 голосов
/ 31 мая 2009

У меня есть несколько объектов jaxb (создается из кода, сгенерированного из xsd jaxb), который мне нужно клонировать. Класс Jaxb, по-видимому, не обеспечивает интерфейс для этого. Я не могу вручную редактировать класс и не могу его расширить - поэтому мне нужно создать вспомогательный / служебный метод для этого. Каков наилучший подход?

Ответы [ 6 ]

8 голосов
/ 31 мая 2009

Учитывая цель JAXB, я думаю, что самый простой способ - это перенести ваш объект в XML и вернуть его обратно.

Много обсуждений на Google .

JAXB FAQ предлагает beanlib .

Существует также обсуждение (а также ссылка для скачивания) плагина Cloneable под jaxb2-commons, хотя я не могу найти никакой ссылки на странице проекта.

3 голосов
/ 03 июня 2012

Я провел тесты для различных решений для клонирования объекта JAXB. Вот некоторые результаты:

  1. Использование плагина xjc-clone для mofokom представляется наиболее быстрым решением. Он просто позволяет всем вашим сгенерированным артефактам реализовать Cloneable и публично переопределяет Object.clone(). К сожалению, это не сделало его центральным Maven (пока).

  2. Создание Serializable артефактов и их сериализация / десериализация в фиктивный поток в 10 раз медленнее, чем при использовании механизмов клонирования Java:

    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. Маршаллинг / демаршаллинг объектов JAXB снова в 5 раз медленнее, чем их сериализация / десериализация. Вот что предлагает *1025* ykaganovich:

    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());
    }
    
3 голосов
/ 11 сентября 2011

Вы можете использовать Копируемый плагин . Он генерирует методы глубокого копирования / клонирования (которые можно даже настроить с помощью стратегий).

3 голосов
/ 03 февраля 2011

Вы должны попробовать cc-xjc , который доступен на sourceforge. Одной из его возможностей является генерация clone () и конструкторов копирования.

1 голос
/ 26 апреля 2017

Это старый поток, но мне также пришлось создавать клонируемые доменные объекты JAXB, и я думаю, что маршаллинг - демаршаллинг не является лучшим решением.

В идеале вы должны копировать объекты в памяти, используя сгенерированные методы клонирования. Существует плагин Maven ( maven-jaxb2-plugin ), который вы можете использовать для этой цели.

Это соответствующий раздел в моем файле Maven 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>

Обратите внимание на аргумент -Xcopyable , который генерирует метод клона внутри всех объектов.

Если вы используете

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 голос
/ 09 апреля 2013

Мы использовали плагин jaxb2-basics - он доступен в репозитории Maven, добавляет только одну зависимость и может также использоваться для генерации других полезных вещей: equals, hashCode, toString, значений по умолчанию и т. Д. Пожалуйста, смотрите эту ссылку для деталей: http://pragmaticintegrator.wordpress.com/2012/11/20/cloning-a-jaxb-object/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...