Care sunt avantajele relative ale XMLEncoder și XStream?

Să presupunem că vreau să stochez multe obiecte de configurare mici în xml și nu mă interesează prea mult despre format. Clasa XMLDecoder încorporată în JDK ar funcționa și, din câte am auzit, XStream funcționează într-un mod similar.

Care sunt avantajele fiecărei biblioteci?

0

8 răspunsuri

Întotdeauna găsesc XStream foarte tentant, pentru că este atât de ușor să mergi. Cu toate acestea, invariabil am ajuns să o înlocuiesc. Este într-adevăr destul de buggy, și de manipulare de colectare ar putea folosi o mulțime de muncă.

Ca urmare, de obicei, trec la JAXB. Este mult mai robust, mult mai lipsit de bug-uri și mai flexibil decât XStream.

0
adăugat
Ce bug-uri sunt în XStream?
adăugat autor Marcus Leon, sursa

O altă sugestie: luați în considerare utilizarea JAXB ( http://jaxb.dev.java.net ). Dacă utilizați JDK 1.6, este inclus în pachet, verificați "javax.xml.bind" pentru detalii, deci nu este nevoie de borcane externe suplimentare.

JAXB este destul de rapid. Îmi place și XStream, dar este puțin mai lent. De asemenea, XMLEncoder este un pic de jucărie (în comparație cu alte opțiuni) ... dar dacă funcționează, nu există nici un rău în utilizarea acestuia.

De asemenea, un avantaj al JAXB este că puteți lega și documentul parțial (sub-arbori); nu este nevoie să creați obiecte pentru întregul fișier. Pentru aceasta, trebuie să utilizați Stax (XMLStreamReader) pentru a indica elementul rădăcină al sub-arborelui, apoi legați-l. Nu este nevoie să utilizați SAX, chiar și pentru majoritatea fișierelor mari, atâta timp cât poate fi prelucrat în bucăți.

0
adăugat
Mulțumesc pentru sugestie. Fac o distincție între legare și serializare, iar această întrebare este orientată spre serializare. Cu toate acestea, menționați că XMLEncoder este o jucărie în comparație cu celelalte. Vă rog să citeți câteva caracteristici specifice ale XStream care lipsesc în XMLEncoder?
adăugat autor erickson, sursa
Destul de corect. Doar că, în cele mai multe cazuri, serializarea bazată pe legare de date funcționează foarte bine. Și nu am văzut nimic care să indice că JAXB nu ar funcționa. Wrt jucărie: lipsă de configurabilitate, doar scrie fasole (fără câmp), integrare xml (XE utilizează șir concat, nu xml scriitor), de performanță.
adăugat autor StaxMan, sursa

Dacă intenționați să stocați toate acele obiecte de configurare într-un singur fișier, iar fișierul va fi destul de mare, ambele opțiuni pe care le-ați prezentat mai sus ar putea fi destul de mari pentru memorie, deoarece ambele necesită citirea întregului fișier în memorie fi deserializate.

Dacă folosirea memoriei este o problemă (fișierul care conține xml va fi foarte mare), vă recomandăm SAX .

Dacă folosirea memoriei nu este o problemă (fișierul care conține xml nu va fi foarte mare), aș folosi tot ce este inclus în JRE implicit (în acest caz XMLDecoder) doar pentru a elimina dependențele unei terțe părți.

0
adăugat
Întregul punct este, tocmai pentru a încărca obiecte în memorie. Este un mecanism de deserializare. Ceea ce aș vrea să evit este construirea unui DOM, apoi mersul pe el pentru a produce un grafic de obiecte paralele, pentru că atunci aș avea copii în memorie două în mod inutil. XMLDecoder, cel puțin, este bazat pe SAX.
adăugat autor erickson, sursa

Aș prefera, de asemenea, XStream , deoarece este foarte ușor de utilizat și de extins. Poți să începi repede dacă mergi cu setarea implicită. Dacă aveți nevoie să personalizați comportamentul, acesta are un API foarte curat și o mulțime de puncte de extensie, astfel încât să aveți un control foarte precis asupra lucrurilor pe care doriți să le optimizați fără a interfera cu alte părți ale procesului de triaj.

Deoarece XML-ul creat de XStream arată frumos, editarea manuală este, de asemenea, simplă. Dacă ieșirea nu satisface nevoile dvs. și lista lungă de convertoare disponibile nu conține cea care aveți nevoie, este destul de simplu să vă scrieți propria dvs.

Un mare plus este, de asemenea, documentația bună despre pagina de pornire .

0
adăugat

Ar trebui să evitați XMLEncoder/XMLDecoder ca pe o ciumă dacă intenționați să persistați un număr netrivial de obiecte sau sistemul dvs. trebuie să fie multietajat. Consultați http://matthew.mceachen.us/blog/do -not-want-xmlencoder-129.html pentru detaliile îngrozitoare.

Dacă trebuie să utilizați XML, XStream este minunat. Dar întrebați-vă dacă într-adevăr trebuie să utilizați XML. Iată un proiect de referință de serializare care vă poate determina soluții mai bune:

http://code.google.com/p/thrift-protobuf- compara/wiki/Benchmarking

0
adăugat

De asemenea, Java are o nouă clasă de utilități destinată stocării seturilor pereche cheie de tip tipic configurațiilor. Este stilul vechi, dar foarte simplu și la îndemână. Acest lucru se face prin java.util.Properties , un obiect Map cu opțiuni de serializare. Acest lucru ar putea fi tot ce aveți nevoie, dacă nu stocați obiecte întregi.

0
adăugat

Îmi place foarte mult XStream bibliotecă. Ea face o treabă foarte bună de a ieși destul de simplu xml ca rezultat al unui obiect Java furnizat. Funcționează excelent pentru reproducere obiectul înapoi de la xml, de asemenea. Și una dintre bibliotecile noastre terțe părți deja depindea de ea oricum.

  • Am ales să o folosim pentru că ne-am dorit xml-ul nostru să fie citit de om. Utilizarea funcția de alias face mult mai frumos.

  • Dacă vă puteți extinde biblioteca doriți ca o parte a unui obiect să deserializați într-o manieră mai plăcută. Noi a făcut acest lucru într-un caz, astfel încât fișierul ar avea un set de grade, minute și secunde pentru o latitudine și longitudine, în loc de două dublu.

Tutorialul de două minute rezumă utilizarea de bază, dar în interesul de a păstra informațiile într-un singur loc, voi încerca să-l însumez sus aici, puțin mai scurtă.

// define your classes
public class Person {
  private String firstname;
  private PhoneNumber phone;
 //... constructors and methods
}

public class PhoneNumber {
  private int code;
  private String number;
 //... constructors and methods
}

Apoi folosiți biblioteca pentru a scrie xml-ul.

// initial the libray
XStream xstream = new XStream();
xstream.alias("person", Person.class);//elementName, Class
xstream.alias("phone", PhoneNumber.class); 

// make your objects
Person joe = new Person("Joe");
joe.setPhone(new PhoneNumber(123, "1234-456"));

// convert xml
String xml = xstream.toXML(joe);

Ieșirea va arăta astfel:


  Joe
  
    123
    1234-456
  

Pentru a reveni:

Person newJoe = (Person)xstream.fromXML(xml);

XMLEncoder-ul este furnizat pentru serializarea Java Bean. Ultima dată când l-am folosit, dosarul părea destul de urât. Dacă într-adevăr nu-i pasă cum arată fișierul, ar putea lucrați pentru dvs. și veți evita o dependență de la al treilea partid, ceea ce este și frumos. Mă așteptam ca posibilitatea de a face mai frumoasa serializare ar fi mai mult o provocare cu XMLEncoder-ul.

XStream afișează numele complet al clasei dacă nu îi aliasați numele. În cazul în care persoana de mai sus a avut o clasă

package example;
the xml would have "example.Person" instead of just "person".
0
adăugat
Aspectul "urât" al lui XMLEncoder ouput este în principal numele de clasă complet calificat. Dacă nu aleg alocarea de pseudonime, ce face XStream cu nume de pachete? Am multe tipuri; codul de clasă specific trebuie să fie minimizat. Cum aș scrie un XSLT generic pentru a transforma orice tip de tip XStreamed, de exemplu, JSON?
adăugat autor erickson, sursa
Aceasta este partea bună. JSON ieșeste deja în JSON . Asta vrei?
adăugat autor Jorge Ferreira, sursa
Nu sunt sigur cum ați scrie un XSLT pentru a trece de la ieșirea XStream la JSON? Ați putea pune o nouă întrebare despre SO. :)
adăugat autor Jay R., sursa

Adăugați la răspunsul @jay cu exemplu:

Cod:

PortfolioAlternateIdentifier identifier = new PortfolioAlternateIdentifier();
identifier.setEffectiveDate(new Date());
identifier.setSchemeCode("AAA");
identifier.setIdentifier("123456");

Ieșirea folosind XStream:


 2014-05-02 20:14:15.961 IST
 AAA
 123456
   

Ieșirea utilizând XMLEncoder:

<?xml version="1.0" encoding="UTF-8"?> 
  
    
      1399041855961    123456   AAA   
 
0
adăugat