2010-04-08 3 views
0

J'ai une structure assez simple, mais potentiellement grande pour sérialiser. Fondamentalement, la structure du XML sera:Est-ce que JAXB peut incrémenter Marshall un objet?

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

Le main_object_type peut avoir une quantité importante de données. Sur mon premier extrait d'enregistrement de 3500, j'ai dû donner à la JVM plus de mémoire que nécessaire. Donc, je voudrais écrire sur le disque après chaque (ou un groupe de) main_object_type.

Je sais que le réglage Marshaller.JAXB_FRAGMENT permettrait de le fragmenter, mais je perds les étiquettes de document xml externes et le <simple_wrapper>.

Des suggestions?

Répondre

2

Que diriez-vous de ce qui suit?

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

Cela suppose que vous avez une @XmlRootElement sur MainObjectType

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class MainObjectType { 
    ... 
} 
0

Vous pouvez placer votre objet dans un flux SAX ou StAX.

+0

Si j'utilise un flux, ne sera pas la méthode standard de création d'un '' JAXBElement pour le '' encore besoin tous les objets contenus à garder en mémoire? Ce que je cherche, c'est comment le décomposer sans avoir à faire beaucoup de travail manuel en écrivant les en-têtes '', etc. Je veux ouvrir '' et écrire chaque '' ils sont récupérés à partir de la BD, sans trop de travail de singe. –

+1

Essayez d'utiliser @XmlID avec un IDResolver personnalisé: http://weblogs.java.net/blog/2005/08/15/pluggable-ididref-handling-jaxb-20 Votre simple enveloppe ne conserverons les ids de objets et récupérer des instances d'objet via le résolveur id. – lexicore

Questions connexes