– Ne olyan gyorsan, fiatalember! Van még két leckém a számodra!

"Kettő? Wow. Nos, oké. Mit nem tennél meg, hogy fokozd a saját hidegvéredet! Én csak füles vagyok."

"Az XML-t, akárcsak a JSON-t, gyakran használják az adatok különböző programok és számítógépek közötti átadásakor. És számos keretrendszer is nagyban leegyszerűsíti a Java programozók életét az XML-lel való munka során. Ma ezek közül mutatok be egyet."

"A JAXB egy kiváló többcélú keretrendszer az XML-lel való munkához."

JAXB - 1

"A JAXB a JDK része, így nem kell külön letöltenie."

"Először hadd mutassak egy példát a használatára, aztán elemezzük. Például:"

Konvertálja az objektumot XML-be
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);
}
Osztály, amelynek objektumai XML-re konvertálódnak
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}
Sorozatosítás eredménye és képernyőkimenet:
<cat> 
<name> Missy </name> 
<age> 5 </age> 
<weight> 4 </weight> 
</cat>

"Valamiért sorról sorra ez a kód a JSON szerializációra emlékeztet. Ugyanazok a megjegyzések, de a JSON ObjectMappert használt, ez pedig Contextet és Marshallert."

"Igen. Tényleg nagyon hasonlítanak egymásra. Jacksont JAXB-ről mintázták. De a JAXB-t is lemásolták valahonnan. Nem lehet a semmiből kitalálni valami zseniálisat."

– Úgy tűnik.

"Rendben, ez történik:"

"A 4-7. sorban létrehozunk egy Cat objektumot, és feltöltjük adatokkal."

"A 10. sorban létrehozunk egy Writer objektumot az eredmény írásához."

"A 13. sorban hozzuk létre a "kontextust". Ez hasonló az ObjectMapperhez, de ezután két további gyermekobjektum jön létre belőle. A Marshaller a szerializálásra, az Unmarshaller pedig a deszerializálásra szolgál. Vannak apró különbségek Jacksonhoz képest, de ez nem az nem alapvetően más."

"A 14. sorban létrehozunk egy Marshaller objektumot. A marshalling a szerializálás szinonimája."

"A 15. sorban a FORMATTED_OUTPUT tulajdonságot TRUE értékre állítjuk. Ez sortöréseket és szóközöket ad az eredményhez, így a kód ember által olvasható, és nem csak az egész szöveget egy sorban."

"A 17. sorban sorba rendezzük az objektumot."

"A 20-21. sorban megjelenítjük a képernyőn a sorozatosítás eredményét."

"Mi az @XmlType(name = 'cat&') és @XmlRootElement megjegyzés?"

" Az @XmlRootElement azt jelzi, hogy ez az objektum lehet az XML-elemek "fa gyökere". Más szóval, ez lehet a legmagasabb szintű elem, és minden más elemet tartalmazhat."

" A @XmlType(name = 'cat') azt jelzi, hogy az osztály részt vesz a JAXB szerializálásában, és megadja az osztály XML-címkéjének nevét is."

"Rendben, most mutatok egy példát az XML deszerializálására:"

Objektumok konvertálása XML-ből
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);
}
Osztály, amelynek objektumai XML-ből deszerializáltak
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}

"Minden majdnem ugyanaz, mint Jacksonnál. De minden esetre elmagyarázok mindent, ami itt történik."

"A 3. sorban átadunk egy karakterláncot , amely a deszerializálandó XML-t tárolja."

"A 4. sorban az XML-karakterláncot egy StringReaderbe csomagoljuk ."

"A 6. sorban létrehozunk egy JAXB kontextust , amelyhez átadjuk az osztályok listáját."

"A 7. sorban létrehozunk egy Unmarshallert – az objektumot, amely végrehajtja a deszerializálást."

"A 9. sorban deszerializáljuk az XML-t az olvasó objektumból, és kapunk egy Cat objektumot."

"Most minden szinte nyilvánvalónak tűnik. De néhány órával ezelőtt azon törtem az agyamat, hogy rájöjjek, hogyan működik."

"Ez mindig megtörténik, ha okosabb leszel. Az összetett dolgok egyszerűvé válnak."

"Egyre okosabb vagyok? Ennek nem tudok nem örülni."

"Remek. Akkor itt van a jegyzetek listája, amelyekkel szabályozhatja a JAXB sorozatosítás eredményét:"

JAXB annotációk Leírás
@XmlElement(név) Egy mező közelében helyezték el.
A mező egy XML elemben lesz tárolva.
Lehetővé teszi a címke nevének beállítását.
@XmlAttribútum(név) Egy mező közelében helyezték el.
A mező XML attribútumként kerül tárolásra!
Lehetővé teszi az attribútum nevének beállítását.
@XmlElementWrapper (nillable = igaz) Egy mező közelében helyezték el.
Lehetővé teszi egy „burkolócímke” beállítását egy elemcsoporthoz.
@XmlType Egy osztály közelében helyezték el.
Lehetővé teszi egy objektum létrehozásának metódusát, ha az alapértelmezett konstruktor privát.
@XmlJavaTypeAdapter Egy mező közelében helyezték el.
Lehetővé teszi, hogy megadja azt az osztályt, amely a mezőt karakterláncsá alakítja.

"Milyen érdekes! De tudna adni egy példát, amely ezeket a megjegyzéseket használja? A magyarázat egy dolog, a működő példa pedig más."

"OK. Mutatok egy példát. Csak azt akartam hozzátenni, hogy a JAXB lehetővé teszi a getter/setter metódusok megjegyzéseit a mezők helyett."

"Íme a példa, amit ígértem:"

Konvertálja az objektumot XML-be
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());
}
Osztály, amelynek objektumai XML-re konvertálódnak
@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()
 {
 }
}
Sorozatosítás eredménye és képernyőkimenet:
<zoo> 
<vadállatok> 
<tigris kora = "5" w = "4"> 
<macskanév>Kisasszony</macskanév> 
</tiger> 
<tigris kora = "5" w = "4"> 
<macskanév>Kisasszony </catname> 
</tiger> 
</wild-animals> 
</zoo>

"Vegye észre, hogy ezúttal nem egy macska objektumot állítunk sorba, hanem egy állatkerti objektumot, amely macska objektumok gyűjteményét tárolja."

"A macska objektumot kétszer adták hozzá a gyűjteményhez, így kétszer szerepel az XML-ben."

"A gyűjteménynek saját " vadállatok " címkéje van, amely a gyűjtemény összes elemét betakarja."

"Az életkor és súly elemek az életkor és w w attribútumokká váltak ."

"Az @XmlElement attribútum használatával a macskacímkét tigriscímkére változtattuk ."

"Figyeljen a 17. sorra. Itt két osztályt ( Állatkert és Cat ) adunk át a JAXB kontextusnak, mivel mindkettő részt vesz a sorozatosításban."

"A mai nap nagyon érdekes volt. Rengeteg új információ."

"Igen. Örülök neked. Most tarts egy kis szünetet, és folytatjuk."