XStream felhasználói útmutató: Objektumok konvertálása XML formátumra

1. Áttekintés

Ebben az oktatóanyagban megtanuljuk, hogyan használhatjuk az XStream könyvtárat a Java objektumok XML formátumba történő sorosítására.

2. Jellemzők

Nagyon sok érdekes előnye van annak, ha az XStream-et serializálja és deserializálja az XML-t:

  • Megfelelően konfigurálva nagyon termel tiszta XML
  • Jelentős lehetőségeket biztosít a testreszabás az XML kimenet
  • Támogatás a objektum grafikonok, köriratokkal együtt
  • A legtöbb használati esetben az XStream példány az szálbiztos, konfigurálás után (vannak megjegyzések a kommentárok használatakor)
  • Törlés közben üzeneteket kapunk kivételkezelés hogy segítsen a problémák diagnosztizálásában
  • Az 1.4.7 verziótól kezdve megvan biztonsági jellemzők elérhető bizonyos típusok sorosításának tiltása érdekében

3. Projekt beállítása

Az XStream használatához a projektben hozzáadjuk a következő Maven-függőséget:

 com.thoughtworks.xstream xstream 1.4.9 

4. Alapvető használat

A XStream osztály az API homlokzata. A .példány létrehozásakor XStream, gondoskodnunk kell a menetbiztonsági kérdésekről is:

XStream xstream = új XStream ();

A példány létrehozása és konfigurálása után több szálon is megosztható a rendezés / visszavonás érdekében, hacsak nem engedélyezi a kommentárok feldolgozását.

4.1. Illesztőprogramok

Több illesztőprogram is támogatott, mint pl DomDriver, StaxDriver, XppDriver, és több. Ezeknek az illesztőprogramoknak különböző teljesítmény- és erőforrás-használati jellemzőik vannak.

Alapértelmezés szerint az XPP3 illesztőprogramot használják, de természetesen könnyen megváltoztathatjuk az illesztőprogramot:

XStream xstream = new XStream (új StaxDriver ()); 

4.2. XML létrehozása

Kezdjük egy egyszerű POJO meghatározásával a - Vevő:

public class Ügyfél {private String keresztnév; privát karakterlánc vezetéknév; magán dátum dob; // szabványos kivitelező, beállítók és szerelők}

Most hozzunk létre egy XML ábrázolást az objektumról:

Ügyfél ügyfél = új Ügyfél ("John", "Doe", új Dátum ()); String dataXml = xstream.toXML (ügyfél);

Az alapértelmezett beállítások felhasználásával a következő kimenet jön létre:

 John Doe 1986-02-14 03: 46: 16.381 UTC 

Ebből a kimenetből egyértelműen láthatjuk, hogy a tartalmazó tag a (z) teljes minősítésű osztálynevét használja Vevő alapértelmezés szerint.

Sok oka lehet annak, hogy úgy döntünk, hogy az alapértelmezett viselkedés nem felel meg az igényeinknek. Például nem biztos, hogy kényelmesen kitesszük alkalmazásunk csomagszerkezetét. Emellett a létrehozott XML lényegesen hosszabb.

5. Álnevek

An álnév egy név, amelyet az alapértelmezett nevek helyett az elemekhez szeretnénk használni.

Például kicserélhetjük com.baeldung.pojo.Vevő val vel vevő álnevet regisztrálva a Vevő osztály. Hozzáadhatunk álneveket is egy osztály tulajdonságaihoz. Álnevek használatával sokkal olvashatóbbá és kevésbé Java-specifikussá tehetjük az XML kimenetünket.

5.1. Osztály álnevek

Az álneveket programozottan vagy jegyzetekkel lehet regisztrálni.

Most jegyezzük fel a sajátunkat Vevő osztályban @XStreamAlias:

@XStreamAlias ​​("ügyfél")

Most be kell állítanunk a példányunkat a következő kommentár használatához:

xstream.processAnnotations (Ügyfél.osztály);

Alternatív megoldásként, ha egy álnevet programozottan akarunk konfigurálni, használhatjuk az alábbi kódot:

xstream.alias ("ügyfél", Ügyfél.osztály);

Akár álnevet, akár programozási konfigurációt használ, az a kimenete Vevő az objektum sokkal tisztább lesz:

 John Doe 1986-02-14 03: 46: 16.381 UTC 

5.2. Field Aliases

A mezőkhöz álneveket is felvehetünk ugyanazon annotációval, amelyet az osztályok álnevezéséhez használtunk. Például, ha a mezőnyt akartuk keresztnév helyébe fn az XML reprezentációban a következő kommentárokat használhatjuk:

@XStreamAlias ​​("fn") privát karakterlánc keresztnév;

Alternatív megoldásként ugyanazt a célt programszerűen is megvalósíthatjuk:

xstream.aliasField ("fn", Customer.class, "keresztnév");

A aliasField A metódus három argumentumot fogad el: az aliast, amelyet használni akarunk, az osztályt, amelyben a tulajdonság definiálva van, és a tulajdonság nevét, amelyet álnéven szeretnénk használni.

Bármelyik módszert alkalmazzuk, a kimenet ugyanaz:

 John Doe 1986-02-14 03: 46: 16.381 UTC 

5.3. Alapértelmezett álnevek

Számos álnév van előre regisztrálva az órákra - íme néhány ezek közül:

álnév ("float", Float.class); álnév ("date", Date.class); álnév ("gregorián-naptár", Naptár.osztály); álnév ("url", URL.class); álnév ("list", List.class); álnév ("locale", Locale.class); álnév ("valuta", Pénznem.osztály);

6. Gyűjtemények

Most hozzáadunk egy listát Elérhetőségeit benne Vevő osztály.

privát Lista contactDetailsList;

Az alapértelmezett gyűjteménykezelési beállításokkal ez a kimenet:

 John Doe 1986-02-14 04: 14: 05.874 UTC 6673543265 0124-2460311 4676543565 0120-223312 

Tegyük fel, hogy el kell hagynunk a contactDetailsList szülőcímkék, és csak mindegyiket akarjuk Elérhetőségeit elem, hogy a vevő elem. Módosítsuk újra a példánkat:

xstream.addImplicitCollection (Customer.class, "contactDetailsList");

Az XML létrehozásakor a gyökércímkék kihagyásra kerülnek, ami az alábbi XML-t eredményezi:

 John Doe 1986-02-14 04: 14: 20.541 UTC 6673543265 0124-2460311 4676543565 0120-223312 

Ugyanez érhető el annotációkkal is:

@XStreamImplicit privát lista contactDetailsList;

7. Átalakítók

Az XStream a térképet használja Átalakító példányok, mindegyik saját konverziós stratégiával rendelkezik. Ezek konvertálják a szolgáltatott adatokat egy meghatározott formátumba XML-ben és vissza.

Az alapértelmezett konverterek használata mellett módosíthatjuk az alapértelmezéseket, vagy regisztrálhatunk egyedi átalakítókat.

7.1. Meglévő átalakító módosítása

Tegyük fel, hogy nem voltunk elégedettek azzal, ahogy dob címkék keletkeztekaz alapértelmezett beállítások használatával. Módosíthatjuk a Dátum az XStream szolgáltatta (DateConverter):

xstream.registerConverter (új DateConverter ("éééé-hh-éééé", null));

A fentiek a „éééé-hh-éé”Formátum:

 John Doe 1986-02-14 

7.2. Egyedi átalakítók

Létrehozhatunk egy egyéni konvertert is, amely ugyanazt a kimenetet hajtja végre, mint az előző szakaszban:

public class A MyDateConverter végrehajtja az átalakítót {private SimpleDateFormat formatter = new SimpleDateFormat ("dd-MM-yyyy"); @Orride public boolean canConvert (Class clazz) {return Date.class.isAssignableFrom (clazz); } @Orride public void marshal (Object value, HierarchicalStreamWriter író, MarshallingContext arg2) {Date date = (Date) érték; író.készletérték (formázó.formátum (dátum)); } // egyéb módszerek}

Végül regisztráljuk MyDateConverter osztály az alábbiak szerint:

xstream.registerConverter (új MyDateConverter ());

Készíthetünk olyan átalakítókat is, amelyek megvalósítják a SingleValueConverter interfész, amelynek célja egy objektum karakterláncokká alakítása.

public class MySingleValueConverter implementálja a SingleValueConverter {@Orride public boolean canConvert (Class clazz) {return Customer.class.isAssignableFrom (clazz); } @Orride public String toString (Object obj) {SimpleDateFormat formatter = new SimpleDateFormat ("dd-MM-yyyy"); Dátum dátum = ([Ügyfél] objektum] .getDob (); return ((Ügyfél) obj) .getFirstName () + "," + ((Ügyfél) obj) .getLastName () + "," + formatter.format (dátum); } // egyéb módszerek}

Végül regisztrálunk MySingleValueConverter:

xstream.registerConverter (új MySingleValueConverter ()); 

Használata MySingleValueConverter, az XML kimenet a Vevő az alábbiak:

John, Doe, 1986-02-14

7.3. Konverter prioritás

Regisztrációkor Átalakító objektumok, lehetséges beállítani a prioritási szintjüket is.

Az XStream javadocsból:

Az átalakítókat kifejezett prioritással lehet regisztrálni. Alapértelmezés szerint az XStream.PRIORITY_NORMAL webhelyen vannak regisztrálva. Az azonos prioritású átalakítókat a regisztrált fordított sorrendben használják. Az alapértelmezett átalakító, vagyis az a konverter, amelyet akkor használnak, ha más regisztrált átalakító nem megfelelő, az XStream prioritással regisztrálható. PRIORITY_VERY_LOW. Az XStream alapértelmezés szerint a ReflectionConvertert használja tartalék átalakítóként.

Az API több megnevezett prioritási értéket biztosít:

privát statikus végső int PRIORITY_NORMAL = 0; privát statikus végső int PRIORITY_LOW = -10; privát statikus végső int PRIORITY_VERY_LOW = -20; 

8.Mezők kihagyása

Kihagyhatunk mezőket a létrehozott XML-ből kommentárokkal vagy programozott konfigurációval. Annak érdekében, hogy egy mezőt annotációval kihagyhassunk, egyszerűen alkalmazzuk a @XStreamOmitField kommentár a kérdéses mezőhöz:

@XStreamOmitField privát karakterlánc keresztnév;

A mező programozott kihagyása érdekében a következő módszert alkalmazzuk:

xstream.omitField (Ügyfél.osztály, "keresztnév");

Bármelyik módszert is választjuk, a kimenet ugyanaz:

 Doe 1986-02-14 

9. Attribútum mezők

Előfordulhat, hogy egy mezőt inkább egy elem attribútumaként, mint önmagában szeretnénk sorosítani. Tegyük fel, hogy a kontakt típus terület:

privát karakterlánc contactType;

Ha beállítani akarunk kontakt típus XML attribútumként használhatjuk a @XStreamAsAttribute kommentár:

@XStreamAsAttribute private String contactType; 

Alternatív megoldásként ugyanazt a célt programszerűen is megvalósíthatjuk:

xstream.useAttributeFor (ContactDetails.class, "contactType");

A fenti módszerek kimenete megegyezik:

 6673543265 0124-2460311 

10. Egyidejűség

Az XStream feldolgozási modellje néhány kihívást jelent. A példány konfigurálása után szálbiztos.

Fontos megjegyezni, hogy a kommentárok feldolgozása közvetlenül a rendezés / lebontás előtt módosítja a konfigurációt. Tehát - ha megköveteljük, hogy a példányt menet közben konfiguráljuk annotációkkal, akkor általában jó ötlet külön XStream példány minden szálhoz.

11. Következtetés

Ebben a cikkben az XStream használatának alapjait ismertettük az objektumok XML formátumba konvertálásával. Ismerkedtünk olyan testreszabásokkal is, amelyekkel biztosíthatjuk, hogy az XML kimenet megfeleljen az igényeinknek. Végül megnéztük a szálbiztonsági problémákat az annotációkkal.

A sorozat következő cikkében megtudhatjuk, hogyan lehet az XML-t visszaállítani Java-objektummá.

A cikk teljes forráskódja letölthető a linkelt GitHub-tárból.


$config[zx-auto] not found$config[zx-overlay] not found