Simple désérialisation XML
Je suis en train de sortir de la XML Simple sérialiseur. Je suis plus intéressé dans la désérialisation XML->Java. Voici mon code de test de l'unité:
import java.io.StringReader;
import java.io.StringWriter;
import junit.framework.TestCase;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
public class SimpleTest extends TestCase {
public void testWriting() throws Exception {
StringWriter writer = new StringWriter();
Address address = new Address("1234 Main Street", "San Francisco", "CA");
Serializer serializer = new Persister();
serializer.write(address, writer);
System.out.println("Wrote: " + writer.getBuffer());
}
public void testReading() throws Exception {
String input = "<address street='1234 Main Street' city='San Francisco' state='CA'/>";
Serializer serializer = new Persister();
System.out.println("Read back: " + serializer.read(Address.class, new StringReader(input)));
}
}
@Root
class Address {
@Attribute(name="street")
private final String street;
@Attribute(name="city")
private final String city;
@Attribute(name="state")
private final String state;
public Address(@Attribute(name="street") String street, @Attribute(name="city") String city, @Attribute(name="state") String state) {
super();
this.street = street;
this.city = city;
this.state = state;
}
@Override
public String toString() {
return "Address [city=" + city + ", state=" + state + ", street=" + street + "]";
}
}
Cela fonctionne, mais la répétition de @Attribute
annotations (sur le terrain et à l'argument du constructeur) dans la classe d'Adresse moche. Est-il possible de:
- simple, figure le nom de l'attribut du nom de champ?
- simple est d'ignorer la sérialisation, de sorte que je peux sortir avec l'annotation soit aux champs ou l'argument du constructeur?
Si vous êtes à la recherche pour facile XML->Java de la désérialisation et ne sont pas liés à un package particulier, voici une autre: sourceforge.net/projects/practicalxml (note que je n'ai pas mis cela comme une réponse parce que vous semblez très downvote heureux, ce qui n'est pas une bonne façon de traiter les gens qui essaient de vous aider)
Merci, je ne suis pas attaché à un package particulier - je vais vérifier practicalxml. Merci de ne pas prendre les downvotes trop personnellement les suggestions proposées étaient nulle part près de la résolution de mon problème et étaient bruyants, de l'OMI.
Sur la deuxième pensée, j'ai été trop downvote heureux. Mes excuses à tout le monde.
Une autre très bonne bibliothèque est XStream. J'ai été capable de faire tout ce que je voulais avec elle jusqu'à présent. 🙂
Merci, je ne suis pas attaché à un package particulier - je vais vérifier practicalxml. Merci de ne pas prendre les downvotes trop personnellement les suggestions proposées étaient nulle part près de la résolution de mon problème et étaient bruyants, de l'OMI.
Sur la deuxième pensée, j'ai été trop downvote heureux. Mes excuses à tout le monde.
Une autre très bonne bibliothèque est XStream. J'ai été capable de faire tout ce que je voulais avec elle jusqu'à présent. 🙂
OriginalL'auteur Binil Thomas | 2009-12-15
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que vous avez besoin de tous que la répétition et l'extra-annotations' attribut. Si le nom est le même que l'attribut de l'objet, il sera utilisé par défaut.
de sorte que vous pouvez simplement déclarer que:
My bad, je n'ai pas plus d'attention que vous voudriez avoir une immuable Adresse. Sur la base actuelle des simple, vous aurez besoin d'avoir la duplication de @Attribut de la balise, car l'annotation sur l'attribut pour la sérialisation et le constructeur pour la désérialisation. Vous pouvez vous en sortir sans étiquette de nom d'attribut, mais pas sur constructeur params, car le compilateur ne garder trace de celui-ci par l'ordre au lieu du nom.
Dépendent de ce que l'objectif que vous souhaitez atteindre. Bien sûr, vous pouvez faire la classe mutable, et de faire respecter l'immutabilité manuellement dans l'incubateur. Mais là encore, le code de devenir laid. Entre les deux, je pourrais juste aller avec double annotations option.
Merci pour les précisions! Je m'attendais à ce que l'argument du constructeur d'annotation aurait besoin de l'attribut de nom (parce que le compilateur gouttes le nom d'argument), mais le fait d'enlever l'attribut name du champ conduit à une "Annotations ne correspondent pas' erreur.
OriginalL'auteur DJ.
Java va sérialiser l'ensemble de vos membres de la classe par défaut s'ils mettent en œuvre
Serializable
et de respecter le JavaBean syntaxe.La sérialisation Java fonctionne dans les deux sens. Si vous sérialiser vos objets Java en XML en utilisant la sérialisation Java, vous pouvez également désérialiser de XML à des objets Java. Le processus est transparent et flexible. Dans une application que j'utilise Java XML de la sérialisation/désérialisation d'écrire l'objet d'arbres sur le disque et de les lire à la demande de l'utilisateur - nous parlons de centaines de milliers de fichiers, et il travaille bien, à mon avis. Découvrez java.sys-con.com/node/37550 pour des exemples - la clé de classes sont
XMLEncoder
etXMLDecoder
.OriginalL'auteur spork
J'ai eu le même soucis mais avec de jolis objets compliqués structures.
Je l'ai résolu en utilisant JAXB bibliothèque de regroupement et de regroupement qui est une jolie commune.
Vous pouvez aussi envisager de totalement séparer le regroupement logique de votre classe java en utilisant les aspects - vous pouvez traiter toutes les annotations dans un aspect distinct, ce qui va rendre votre classe java entièrement propre à partir de marshaling des annotations.
OriginalL'auteur DiSol