Comment sérialiser HashTable<String, String> XML en utilisant JAXB?
Je suis en train d'utiliser JAXB pour sérialiser un HashTable<String, String>
à XML. Je suis très nouveau à Java (est venu à partir de C#), donc je suis un peu perplexe par cette tâche.
J'ai vu le code suivant:
public static <T> String ObjectToXml(T object, Class<T> classType) throws JAXBException
{
JAXBContext jaxbContext = JAXBContext.newInstance(classType);
StringWriter writerTo = new StringWriter();
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(object, writerTo); //create xml string from the input object
return writerTo.toString();
}
Qui est invoquée comme suit: ObjectToXml(o, ClassOfO.class)
, mais HashTable<String, String>.class
est mal (que je connais déjà).
Pouvez Java gourous là me montrer comment appeler ce code? Proposer une simplification de la mise en œuvre (avec une invocation exemple, bien sûr) n'est plus la bienvenue.
Grâce.
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin de créer une classe wrapper à tenir sur le
Hashtable
:Ensuite, vous pouvez effectuer les opérations suivantes:
Cela produira la sortie suivante:
Choses à Noter
JAXBContext
est thread-safe objet et doit être créé qu'une seule fois et de les réutiliser.Hashtable
est synchronisé, si vous n'avez pas besoin de ce alors à l'aide deHashMap
est la commune de remplacement.La personnalisation de la Cartographie
Vous pouvez utiliser un
XmlAdapter
dans JAXB pour personnaliser le mappage de classe. Ci-dessous un lien vers un post sur mon blog où je montre comment faire:Malheureusement, JAXB n'est pas en mesure de sérialiser directement un
Map
ouHashMap
instance directement. Au lieu de cela, vous aurez à faire une sorte de traduction à partir d'unMap
dans une liste d'entrées qui ont une clé et une valeur. Essayez de regarder dans ce Débordement de Pile question et voir si ça peut vous aider. Ce problème montre beaucoup dans Google, et la triste réponse est que JAXB ne sais pas comment sérialiser unMap
.Bah! Si vous aviez seulement googlé sur jaxb et hashmap vous ont directement trouvé ceci: http://download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html
Mais, oui, j'ai une sorte d'accord que la "perplexité" est une bonne description de la sensation de la non-évidence de la tâche.
Alors que vous pourriez être familier avec le C# réifiée génériques, Java génériques sont pour moment de la compilation, seulement, ils s'en vont au moment de l'exécution. C'est pourquoi, au moment de l'exécution, même si vous avez une instance établie avec les génériques (Tels que la Chaîne de table de hachage (HashTable) lors de l'exécution de ces génériques en aller, tout ce que vous pouvez faire est d'obtenir la classe de la chose (HashTable ici) et pas les types génériques (Chaîne ici). En bref: le temps de compilation
Hashtable<String,String>
devient table de hachage lors de l'exécution (ou, pour être totalement pédantHashTable<?,?>
)Je pense que votre meilleur pari est de créer un schéma xml qui reflète ce que vous voulez et puis exécutez xjc sur elle. De cette façon, vous avez un certain contrôle sur ce qu'xml va ressembler w/o d'entrer dans les entrailles de JaxB.
http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/jaxb/xjc.html
Vous pouvez ensuite traduire votre table de hachage pour les objets générés et de les transmettre à cette variation de votre méthode statique.