Может JAXB постепенно Маршалл Объект? - PullRequest
0 голосов
/ 08 апреля 2010

У меня довольно простая, но потенциально большая структура для сериализации. В основном структура XML будет:

<simple_wrapper>
   <main_object_type>
     <sub_objects>
   </main_object_type>
     ... main_object_type repeats up to 5,000 times
</simple_wrapper>

main_object_type может содержать значительное количество данных. На моем первом 3500 записях мне пришлось выделить JVM больше памяти, чем нужно.

Итак, я хотел бы записать на диск после каждого (или связки) main_object_type.

Я знаю, что настройка Marshaller.JAXB_FRAGMENT позволит фрагментировать его, но я теряю внешние теги XML-документа и <simple_wrapper>.

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 06 июля 2010

Как насчет следующего?

JAXBContext jaxbContext= JAXBContext.newInstance(MainObjectType.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

OutputStreamWriter writer = new OutputStreamWriter(System.out);

// Manually open the root element
writer.write("<simple_wrapper>");

// Marshal the objects out individually
marshaller.marshal(mainObjectType1, writer);
marshaller.marshal(mainObjectType2, writer);
marshaller.marshal(mainObjectType3, writer);
marshaller.marshal(mainObjectType4, writer);
...

// Manually close the root element
writer.write("</simple_wrapper>");
writer.close();

Предполагается, что у вас есть @XmlRootElement для MainObjectType

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class MainObjectType {
    ...
}
0 голосов
/ 08 апреля 2010

Вы можете поместить свой объект в поток SAX или StAX.

...