"Ikke så fort, unge mann! Jeg har to leksjoner til for deg!"

"To? Wow. Vel, ok. Hva ville du ikke gjort for å forbedre din egen kulhet! Jeg er helt i ørene."

"XML, som JSON, brukes ofte når data overføres mellom ulike programmer og datamaskiner. Og det er flere rammeverk som i stor grad forenkler livene til Java-programmerere når de jobber med XML. I dag skal jeg introdusere deg for en av dem."

"JAXB er et utmerket flerbruksrammeverk for å arbeide med XML."

JAXB - 1

"JAXB er en del av JDK, så du trenger ikke å laste det ned separat."

"La meg først vise deg et eksempel på hvordan du bruker det, og så skal vi analysere 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 skjermutgang:
<cat> 
<name> Missy </name> 
<age> 5 </age> 
<weight> 4 </weight> 
</cat>

"Av en eller annen grunn, linje for linje, minner denne koden meg om JSON-serialisering. De samme merknadene, men JSON brukte en ObjectMapper, og denne bruker Context og Marshaller."

"Jepp. De er virkelig veldig like. Jackson ble modellert etter JAXB. Men JAXB ble også kopiert fra et sted. Du kan ikke finne opp noe genialt fra bunnen av."

"Det virker sånn."

"OK, her er hva som skjer:"

"På linje 4-7 lager vi et Cat- objekt og fyller det med data."

"I linje 10 lager vi et Writer-objekt for å skrive resultatet."

"I linje 13 lager vi 'konteksten'. Dette ligner på ObjectMapper, men så lages to ekstra underordnede objekter fra det. Marshaller er for serialisering, og Unmarshaller er for deserialisering. Det er små forskjeller fra Jackson, men det er ikke ikke fundamentalt annerledes."

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

"I linje 15 satte vi egenskapen FORMATTED_OUTPUT til TRUE. Dette vil legge til linjeskift og mellomrom til resultatet, slik at koden er lesbar av mennesker, og ikke bare har all teksten på én linje."

"I linje 17 serialiserer vi objektet."

"I linje 20-21 viser vi resultatet av serialiseringen på skjermen."

"Hva er @XmlType(name = 'cat&') og @XmlRootElement-kommentarene?"

" @XmlRootElement indikerer at dette objektet kan være 'roten til et tre' av XML-elementer. Med andre ord kan det være elementet på høyeste nivå, og kan inneholde alle andre elementer."

" @XmlType(navn = 'cat') indikerer at klassen er involvert i JAXB-serialisering, og spesifiserer også navnet på XML-koden for denne klassen."

"Ok, nå skal jeg vise deg 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 deserialisert fra XML
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}

"Alt er nesten det samme som med Jackson. Men for sikkerhets skyld skal jeg forklare alt som skjer her."

"I linje 3 sender vi en streng som lagrer XML som skal deserialiseres."

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

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

"I linje 7 lager vi en Unmarshaller - objektet som skal utføre deserialiseringen."

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

"Nå virker det nesten opplagt. Men for et par timer siden tråkket jeg hjernen min for å finne ut hvordan det fungerer."

"Det skjer alltid når du blir smartere. Komplekse ting blir enkle."

"Jeg blir smartere? Jeg kan ikke annet enn å være glad for det."

"Flott. Her er en liste over merknader du kan bruke til å kontrollere resultatet av JAXB-serialisering:"

JAXB-kommentarer Beskrivelse
@XmlElement(navn) Plassert nær et jorde.
Feltet vil bli lagret i et XML-element.
Lar deg angi etikettens navn.
@XmlAttribute(navn) Plassert nær et jorde.
Feltet vil bli lagret som et XML-attributt!
Lar deg angi attributtnavnet.
@XmlElementWrapper(nillable = true) Plassert nær et jorde.
Lar deg angi en "wrapper-tag" for en gruppe elementer.
@XmlType Plassert i nærheten av en klasse.
Lar deg spesifisere en metode for å lage et objekt hvis standardkonstruktøren er privat.
@XmlJavaTypeAdapter Plassert nær et jorde.
Lar deg spesifisere klassen som skal konvertere feltet til en streng.

"Hvor interessant! Men kan du gi meg et eksempel som bruker disse merknadene? En forklaring er én ting, men et fungerende eksempel er noe annet."

"OK. Jeg skal vise deg et eksempel. Jeg ville bare legge til at JAXB lar deg kommentere getter/setter-metoder i stedet for felt."

"Her er det eksemplet jeg lovet:"

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 skjermutgang:
<zoo> 
<wild-animals> 
<tiger age = "5" w = "4"> 
<catname>Miss</catname> 
</tiger> 
<tiger age = "5" w = "4"> 
<catname>Frøken </catname> 
</tiger> 
</wild-animals> 
</zoo>

"Merk at denne gangen ser vi ikke et Cat-objekt, men et Zoo-objekt som lagrer en samling av Cat-objekter."

"Katteobjektet ble lagt til samlingen to ganger, så det er i XML-en to ganger."

"Samlingen har sin egen " ville-animals "-merke som omslutter alle samlingens elementer.

" Alder og vekt- elementer har blitt alder & w-attributtene."

"Ved å bruke et @XmlElement- attributt endret vi kattemerket til et tigermerke ."

"Vær oppmerksom på linje 17. Her sender vi to klasser ( Zoo og Cat ) til JAXB-konteksten, siden de begge er involvert i serialiseringen."

"I dag var en veldig interessant dag. Så mye ny informasjon."

"Ja. Jeg er glad på din vegne. Ta en liten pause nå, så fortsetter vi."