问题
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
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?
回答1:
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 {
...
}
回答2:
You can marshal your object into a SAX or StAX stream.
来源:https://stackoverflow.com/questions/2602720/can-jaxb-incrementally-marshall-an-object