开发者

Can JAXB Incrementally Marshall An Object?

开发者 https://www.devze.com 2022-12-26 08:40 出处:网络
I\'ve got a fairly simple, but potentially large structure to serialize.Basically the structure of the XML will be:

I've got a fairly simple, but potentially large structure to serialize. Basically the structure of the XML will be:

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

The main_object_type 开发者_JAVA技巧can have a significant amount of data. On my first 3,500 record extract, I had to give the JVM way more memory than it should need.

So, I'd like to write out to disk after each (or a bunch of) main_object_type.

I know that setting Marshaller.JAXB_FRAGMENT would allow it fragments, but I loose the outer xml document tags and the <simple_wrapper>.

Any suggestions?


How about the following?

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();

This assumes you have an @XmlRootElement on MainObjectType

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class MainObjectType {
    ...
}


You can marshal your object into a SAX or StAX stream.

0

精彩评论

暂无评论...
验证码 换一张
取 消