CodeGym /Cours Java /Collections Java /Sérialisation complexe vers XML, JAXB (classes imbriquées...

Sérialisation complexe vers XML, JAXB (classes imbriquées, etc.)

Collections Java
Niveau 3 , Leçon 9
Disponible

"D'accord, alors. Comme vous l'avez probablement déjà deviné, ce n'était pas tout."

"Maintenant, je vais vous parler de plusieurs autres aspects de JAXB. Mais comme nous l'avons fait avec JSON, nous allons commencer par les collections."

"Lors de la désérialisation de collections à l'aide de JAXB, il existe également une incertitude quant à la collection particulière (ArrayList, LinkedList, Vector, etc.) à utiliser pour la variable List. Et encore une fois, la réponse à cette question est fournie par des annotations."

"Tout est assez simple. Si le type de collection n'est pas spécifié dans son annotation, alors JAXB essaiera de sélectionner la collection la plus appropriée en utilisant son type. Pour une liste, ce sera ArrayList ; pour une carte, ce sera HashMap, etc. ."

"En réalité, il y a beaucoup moins de problèmes ici qu'avec JSON, car chaque classe a une balise unique, et vous pouvez utiliser la balise pour spécifier la classe exacte."

"Par exemple, si vous avez besoin de désérialiser un groupe d'éléments qui héritent d'un ancêtre commun, vous utilisez l'  annotation @XmlAny: "

Convertir un objet à partir de XML
public static void main(String[] args) throws JAXBException
{
 String xmldata = "<zoo><cat/><cat/><dog/><cat/></zoo>";
 StringReader reader = new StringReader(xmldata);

 JAXBContext context = JAXBContext.newInstance(Cat.class, Zoo.class, Dog.class);
 Unmarshaller unmarshaller = context.createUnmarshaller();

 Cat cat = (Cat) unmarshaller.unmarshal(reader);
}
Une classe dont les objets sont désérialisés à partir de XML
@XmlType(name = "zoo") 
@XmlRootElement 
class  Zoo 
{ 
@XmlAny public  List<Object> animaux ; } 
 


@XmlType(name = "cat") 
@XmlRootElement 
class  Cat 
{ 
public  String name;  l'âge public ; poids int public ; 
 
 

 Chat() 
 { 
 } 
}

@XmlType(name = "dog") 
@XmlRootElement 
class  Dog 
{ 
public  String name;  l'âge public ; poids int public ; 
 
 

 Chat() 
 { 
 } 

"Si une collection est marquée avec l' annotation @XmlAny , tous les objets appropriés peuvent y être placés. Et le JAXB Unmarshaller fait attention aux balises lors du remplissage de la collection."

"Dans ce cas, la séquence de tags " <zoo> <cat/><cat/> <dog/> <cat/> </zoo> " sera convertie en une collection avec les objets Cat, Cat, Dog et Cat ."

"C'est à peu près ce à quoi je m'attendais."

"Uh-huh. Oh, au fait, encore une chose. Si vous désérialisez un mélange de texte et de balises, vous devez utiliser l' annotation @XmlMixed ."

"Voici un exemple de ce type de XML :"

Exemple de XML nécessitant l'annotation @XmlMixed
<data> 
<items> 
test 1 <item/> texte 2 <item> nom </item> texte 3 </items> </data> 

 

 

 

"Wow. J'avais oublié qu'un tel XML existe. Je me suis habitué à ce que tout soit beau, avec des balises intégrées et tout le reste."

"Cela existe. Et JAXB a une annotation même pour ce cas !"

"Génial. Au fait, je voulais demander : comment les énumérations sont-elles sérialisées ?"

"Bonne question ! Belle prise ! J'ai en quelque sorte sauté ce sujet."

"Il existe une annotation spéciale @XmlEnum qui doit être utilisée pour marquer les énumérations. Vous pouvez l'utiliser pour spécifier si les valeurs seront stockées sous forme de nombres ou de chaînes."

"Il existe également une annotation @XmlEnumValue qui vous permet de spécifier la valeur qui correspondra à un champ enum particulier."

"Voici quelques exemples:"

Nombres Cordes
@XmlType
@XmlEnum(Integer.class)
public enum Code
{
 @XmlEnumValue("1")
  START,

 @XmlEnumValue("2")
  INPROGRESS,

 @XmlEnumValue("3")
  FINISH

 @XmlEnumValue("-1")
  ERROR
}
@XmlType
@XmlEnum(String.class)
public enum Card
{
 @XmlEnumValue("Spade")
  CLUBS,

 @XmlEnumValue("Diamond")
  DIAMONDS,

 @XmlEnumValue("Heart")
  HEARTS,

 @XmlEnumValue("Club")
  SPADES
}

"Bon sang. Je ne peux pas imaginer où j'en aurais besoin, mais je pense que c'est très utile. Et surtout, je n'ai pas à m'en tenir à des chaînes standard ou à des valeurs numériques."

"Oui. C'est pratique, par exemple, lorsque vous écrivez un programme qui échange des messages avec, disons, un serveur Facebook, et qu'ils ont un ensemble de valeurs assigné. Il vous suffit de les assigner à leur propre énumération et tout fonctionnera. "

"C'est merveilleux. J'aime vraiment JAXB."

"Génial. Alors c'est tout pour aujourd'hui. Va faire une pause."

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION