"Ikke så hurtigt, unge mand! Jeg har to lektioner mere til dig!"

"To? Wow. Nå, okay. Hvad ville du ikke gøre for at forbedre din egen coolness! Jeg er alle ører."

"XML bruges, ligesom JSON, ofte, når data overføres mellem forskellige programmer og computere. Og der er flere frameworks, som i høj grad forenkler livet for Java-programmører, når de arbejder med XML. I dag vil jeg præsentere dig for en af ​​dem."

"JAXB er en fremragende multifunktionsramme til at arbejde med XML."

JAXB - 1

"JAXB er en del af JDK, så du behøver ikke at downloade det separat."

"Lad mig først vise dig et eksempel på, hvordan du bruger det, og så analyserer vi det. For eksempel:"

Konverter et objekt til XML
public static void main(String[] args) throws JAXBException
{
 // Create an object to be serialized into XML
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 // Write the result of the serialization to a StringWriter
 StringWriter writer = new StringWriter();

 // Create a Marshaller object that will perform the serialization
 JAXBContext context = JAXBContext.newInstance(Cat.class);
 Marshaller marshaller = context.createMarshaller();
 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
 // And here's the serialization itself:
 marshaller.marshal(cat, writer);

 // Convert everything written to the StringWriter
 String result = writer.toString();
 System.out.println(result);
}
En klasse, hvis objekter konverteres til XML
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}
Serialiseringsresultat og skærmoutput:
<cat> 
<name> Missy </name> 
<age> 5 </age> 
<weight> 4 </weight> 
</cat>

"Af en eller anden grund, linje for linje, minder denne kode mig om JSON-serialisering. De samme annoteringer, men JSON brugte en ObjectMapper, og denne bruger Context og Marshaller."

"Jep. De er virkelig meget ens. Jackson blev modelleret efter JAXB. Men JAXB blev også kopieret fra et sted. Man kan ikke opfinde noget genialt fra bunden."

"Det virker sådan."

"OK, her er hvad der sker:"

"I linje 4-7 opretter vi et Cat- objekt og udfylder det med data."

"I linje 10 opretter vi et Writer-objekt for at skrive resultatet."

"I linje 13 skaber vi 'konteksten'. Dette ligner ObjectMapper, men så oprettes der to ekstra underordnede objekter ud fra det. Marshaller er til serialisering, og Unmarshaller er til deserialisering. Der er små forskelle fra Jackson, men det er ikke ikke fundamentalt anderledes."

"I linje 14 skaber vi et Marshaller- objekt. Marshalling er et synonym for serialisering."

"I linje 15 satte vi egenskaben FORMATTED_OUTPUT til TRUE. Dette vil tilføje linjeskift og mellemrum til resultatet, så koden er læselig af mennesker og ikke kun har al teksten på én linje."

"I linje 17 serialiserer vi objektet."

"I linje 20-21 viser vi resultatet af serialiseringen på skærmen."

"Hvad er @XmlType(name = 'cat&') og @XmlRootElement annoteringerne?"

" @XmlRootElement angiver, at dette objekt kan være 'roden af ​​et træ' af XML-elementer. Med andre ord kan det være elementet på højeste niveau og kan indeholde alle andre elementer."

" @XmlType(navn = 'kat') angiver, at klassen er involveret i JAXB-serialisering, og angiver også navnet på XML-tagget for denne klasse."

"Okay, nu vil jeg vise dig et eksempel på XML-deserialisering:"

Konverter et objekt fra XML
public static void main(String[] args) throws JAXBException
{
 String xmldata = "<cat><name>Missy</name><age>5</age><weight>4</weight></cat>";
 StringReader reader = new StringReader(xmldata);

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

 Cat cat = (Cat) unmarshaller.unmarshal(reader);
}
En klasse, hvis objekter er deserialiseret fra XML
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}

"Alt er næsten det samme som med Jackson. Men for en sikkerheds skyld vil jeg forklare alt, hvad der foregår her."

"I linje 3 sender vi en streng , der gemmer XML, der skal deserialiseres."

"I linje 4 pakker vi XML-strengen ind i en StringReader ."

"I linje 6 opretter vi en JAXB-kontekst , som vi videregiver listen over klasser til."

"I linje 7 skaber vi en Unmarshaller - objektet, der vil udføre deserialiseringen."

"I linje 9 deserialiserer vi XML fra læserobjektet og får et Cat-objekt."

"Nu virker det hele næsten indlysende. Men for et par timer siden knoklede jeg min hjerne for at finde ud af, hvordan det fungerer."

"Det sker altid, når man bliver klogere. Komplekse ting bliver simple."

"Jeg bliver klogere? Det kan jeg ikke lade være med at være glad for."

"Fantastisk. Så er her en liste over annoteringer, du kan bruge til at kontrollere resultatet af JAXB-serialisering:"

JAXB-annoteringer Beskrivelse
@XmlElement(navn) Placeret nær en mark.
Feltet vil blive gemt i et XML-element.
Giver dig mulighed for at angive mærkets navn.
@XmlAttribute(navn) Placeret nær en mark.
Feltet vil blive gemt som en XML-attribut!
Giver dig mulighed for at angive attributtens navn.
@XmlElementWrapper(nillable = sand) Placeret nær en mark.
Giver dig mulighed for at angive et 'indpakningsmærke' for en gruppe af elementer.
@XmlType Placeret i nærheden af ​​en klasse.
Giver dig mulighed for at angive en metode til at oprette et objekt, hvis standardkonstruktøren er privat.
@XmlJavaTypeAdapter Placeret nær en mark.
Lader dig angive den klasse, der skal konvertere feltet til en streng.

"Hvor interessant! Men kan du give mig et eksempel, der bruger disse annoteringer? En forklaring er én ting, men et fungerende eksempel er noget andet."

"OK. Jeg vil vise dig et eksempel. Jeg ville bare tilføje, at JAXB lader dig kommentere getter/setter-metoder i stedet for felter."

"Her er det eksempel, jeg lovede:"

Konverter et objekt til XML
public static void main(String[] args) throws JAXBException
{
 // Create Cat and Zoo objects to be serialized into XML
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 Zoo zoo = new Zoo();
 zoo.animals.add(cat);
 zoo.animals.add(cat);

 // Write the result of the serialization to a StringWriter
 StringWriter writer = new StringWriter();

 // Create a Marshaller object that will perform the serialization
 JAXBContext context = JAXBContext.newInstance(Cat.class, Zoo.class);
 Marshaller marshaller = context.createMarshaller();
 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
 // Here's the serialization itself
 marshaller.marshal(zoo, writer);

 // Convert everything written to the StringWriter into a String
 System.out.println(writer.toString());
}
En klasse, hvis objekter konverteres til XML
@XmlType(name = "zoo")
@XmlRootElement
public class Zoo
{
 @XmlElementWrapper(name = "wild-animals", nillable = true)
 @XmlElement(name = "tiger")
 public List<Cat> animals = new ArrayList<>();
}

public class Cat
{
 @XmlElement(name = "catname")
 public String name;
 @XmlAttribute(name = "age")
 public int age;
 @XmlAttribute(name = "w")
 public int weight;

 public Cat()
 {
 }
}
Serialiseringsresultat og skærmoutput:
<zoo> 
<wild-animals> 
<tiger age = "5" w = "4"> 
<catname>Missy</catname> 
</tiger> 
<tiger age = "5" w = "4"> 
<catname>Frøken </catname> 
</tiger> 
</wild-animals> 
</zoo>

"Bemærk, at vi denne gang ikke serialiserer et Cat-objekt, men et Zoo-objekt, der gemmer en samling af Cat-objekter."

"Katteobjektet blev tilføjet til samlingen to gange, så det er i XML to gange."

"Samlingen har sit eget ' vilde dyr' -mærke, der omslutter alle samlingens elementer."

" Alder & vægt- elementerne er blevet til alder & w-attributterne."

"Ved at bruge en @XmlElement- attribut ændrede vi kattemærket til et tigermærke ."

"Vær opmærksom på linje 17. Her sender vi to klasser ( Zoo og Cat ) til JAXB-sammenhængen, da de begge er involveret i serialiseringen."

"I dag var en meget interessant dag. Så meget ny information."

"Ja. Jeg er glad på din vegne. Hold nu en kort pause, så fortsætter vi."