JAXB nedir ve neden kullanmalıyım? [kapalı]


109

Burada JAXB'nin dilimlenmiş ekmekten bu yana en harika şey olduğuna yemin eden bir adam var. Stack Overflow kullanıcılarının JAXB için kullanım senaryosunun ne olduğunu ve bu durum için onu neyin iyi veya kötü bir çözüm yaptığını düşündüklerini merak ediyorum.


2
Bu Makaleyi okuyun (XML Bağlama için Java Mimarisi (JAXB)) bu en iyisidir. URL: oracle.com/technetwork/articles/javase/index-140168.html#unmars

Yanıtlar:


99

XML'i işlemek için büyük bir JAXB hayranıyım. Temel olarak, bu soruna bir çözüm sağlar (XML, Java veri yapıları ve XML Şemalarına aşina olduğumu varsayıyorum):

XML ile çalışmak zordur. Temelde bir metin dosyası olan bir XML dosyasını alıp, programınızın daha sonra işleyebileceği bir tür veri yapısına dönüştürmenin bir yoluna ihtiyaç vardır.

JAXB, yazdığınız bir XML Şemasını alacak ve bu şemaya karşılık gelen bir sınıflar kümesi oluşturacaktır. JAXB yardımcı programları, bu XML'i işlemek için veri yapılarının hiyerarşisini yaratacaktır.

JAXB daha sonra bir XML dosyasını okumak ve ardından oluşturulan sınıfların örneklerini oluşturmak için kullanılabilir - XML'inizdeki verilerle yüklü. JAXB bunun tersini de yapar: java sınıflarını alır ve karşılık gelen XML'i oluşturur.

JAXB'yi seviyorum çünkü kullanımı kolay ve Java 1.6 ile birlikte geliyor (1.5 kullanıyorsanız JAXB .jars'ı indirebilirsiniz.) Sınıf hiyerarşisini oluşturma şekli sezgiseldir ve tecrübelerime göre iyi bir iş çıkarır "XML" yi soyutlayarak "veriye" odaklanabiliyorum.

Sorunuzu yanıtlamak için: Küçük XML dosyaları için JAXB'nin aşırı derecede kullanılmasını bekliyorum. Bir XML şeması oluşturmanızı ve sürdürmenizi ve veri yapıları için Java sınıflarını kullanmak için "standart ders kitabı yöntemlerini" kullanmanızı gerektirir. (Ana sınıflar, "düğümleri" temsil eden küçük iç sınıflar ve bunların büyük bir hiyerarşisi.) Dolayısıyla, JAXB, bir uygulama için basit bir doğrusal "tercihler" listesi için muhtemelen o kadar da iyi değildir.

Ancak, oldukça karmaşık bir XML şemanız varsa ve içinde çok sayıda veri varsa, JAXB harikadır. Projemde, ikili (bir C programı tarafından tüketilen) ve XML (böylece insanlar bu verileri tüketip değiştirebilsin) arasında büyük miktarda veriyi dönüştürüyordum. Sonuçta ortaya çıkan XML Şeması önemsizdi (birçok hiyerarşi seviyesi, bazı alanlar tekrarlanabilir, diğerleri tekrarlanamaz), bu nedenle JAXB bunu idare edebilmek için yardımcı oldu.


21
JAXB, XSD olmadan yapılabilir. Ek açıklamaları kullanabilirsiniz: jaxb.dev.java.net/guide/Mapping_your_favorite_class.html
codefinger

7
JAXB bir spesifikasyondur (JPA veya JAXP gibi), yani birden fazla uygulama (Metro, EclipseLink, vb.) Vardır. Biriyle ilgili bir sorununuz varsa, başka bir uygulamaya geçebilirsiniz. Farklı satıcılar tarafından sunulan uzantılardan da yararlanabilirsiniz.
bdoughan

@BlaiseDoughan, Metro bir JAXB uygulaması mı?! Metro bir WSIT uygulaması değil mi?
Muhammad Gelbana

1
@MuhammadGelbana - Sanırım Metro JAX-WS uygulamasının ( metro.java.net ) bir parçası olan Project JAXB ( jaxb.java.net ) olarak anılmalıyım .
bdoughan

2
Bilginize, JAXB, Java SE 11'den kaldırılıyor. Bkz. JEP 320: Java EE ve CORBA Modüllerini Kaldırma . Bu eylem, Java SE'nin Modülerleştirilmesi ve Java EE teknolojilerinin Jakarta EE projesine devredilmesinin bir parçası olarak gerçekleştirilmektedir . JAXB API'sini ve projenize bir uygulama eklemeniz gerekecek.
Basil Bourque

23

İşte onu kullanmamanız için bir neden: performans zarar görür. Sıralayarak ve geri çekerken çok fazla ek yük vardır. Ayrıca, JiBX: http://jibx.sourceforge.net/ gibi XML-Nesne bağlama için başka bir API'yi de düşünebilirsiniz.


1
Bağlamalarda sorun yaşıyorsanız XSD2Jibx aracını kullanmayı da düşünün - "alfa" durumundadır, ancak XSD şemalarıyla sevdiği sınıfları ve bağlamaları göstermek gerçekten yararlıdır ... şimdi, yalnızca varsayılan olarak SQL tarihini kullanmayı bıraktıysa , ve onun yerine Java kullanım Tarihi kullanıldı ...
MetroidFan2002

3
Saçmalık. JAXB, hızlı ayrıştırıcı (Woodstox gibi) kullandığınız sürece oldukça hızlıdır, manuel ciltlemeye kıyasla belki% 30-40 ek yük. JiBX iyi, sorun değil ama performans farkı çok büyük değil.
StaxMan

6
JAXB'yi birkaç projede kullandım ve kullanmaya devam ediyorum. Ancak diğer çerçevelerle nasıl karşılaştırıldığını anlamak önemlidir. Yüzlerce megabaytlık belgeleri sıralıyorsanız / sıralıyorsanız ve zaman önemliyse - JiBX iyi bir alternatiftir. JAXB == yansıma, JiBX == bayt kodu enstrümantasyonu.
codefinger

19

Bu bir "XML için ORM" dir. WS Death Star sistemleri için çoğunlukla JAX-WS ile birlikte kullanılır (ve aslında Sun uygulamaları birlikte geliştirilir).


19

JAXB'yi her zaman işte kullanıyorum ve gerçekten çok seviyorum. Sürekli değişen karmaşık XML şemaları için mükemmeldir ve özellikle bir XML dosyasındaki etiketlere rastgele erişim için iyidir.

Pezevenklikten nefret ederim ama yeni bir blog başlattım ve bu gerçekten hakkında yazdığım ilk şey!

Buradan kontrol edin:

http://arthur.gonigberg.com/2010/04/21/getting-started-with-jaxb/


4
Blogunuzda açık bir örnek. Bunun için oy verildi. :-)
Shawn D.

9

JAXB ile, nesnelerinizin XML temsillerini (sıralama) ve XML'in nesne temsillerini (eşleştirme) otomatik olarak oluşturabilirsiniz.

XML Şeması söz konusu olduğunda, iki seçeneğiniz vardır:

  • Bir XSD'den Java sınıfları oluşturun
  • Java sınıflarınızdan bir XSD oluşturun

Alternatif olabilecek XStream , Digester veya XMLBeans gibi bazı daha basit XML serileştirme kitaplıkları da vardır.


1
Bunlar bağlayıcı çerçeveler değil, serileştirme kitaplıklarıdır. İyi bir bağlama çerçevesi, herhangi bir XML'i izomorfik bir nesne grafiğine veya tekrar geriye eşleyebilir. Bu basit serileştirme mekanizmaları, sabit, standart olmayan bir XML şeması üretir ve tüketir.
erickson

Teşekkürler Ericson, sadece JAXB ile çalıştım ve alternatiflerden bahsettiğimden emin olmak istedim. Cevabımı girdinize göre düzenleyeceğim.
Fabian Steeg

Aslında, XStream tamam olsa da, her ikisi de çok basit olduğu için gerçekten basit değil. Digester basit DEĞİL, sadece basittir.
StaxMan

2
Birisi lütfen Ek Açıklamaları kullanarak JAXB-2.0'dan bahsedin. Bunun arasında birkaç XmlAdapter sınıfı, herhangi bir şemayı mevcut herhangi bir Java yapısına eşleyebilirim.
Mark Renouf

8

XML şeması ( xsd) olarak tanımlanan bazı harici XML spesifikasyonlarına kod yazmanız gerekiyorsa JAXB harikadır .

Örneğin, bir alım satım uygulamanız var ve alım satımları Uber Lame Ticaret Raporlama Uygulamasına rapor etmeniz gerekiyor ve onlar size devam etmeniz ultra.xsdiçin verdiler. $JAVA_HOME/bin/xjcXML'yi bir grup Java sınıfına (örneğin UltraTrade) dönüştürmek için derleyiciyi kullanın .

Ardından , ticari nesnelerinizi dönüştürmek için basit bir adaptör katmanı yazabilir ve verileri Ultra-Corp'a sıralamak için UltraTradeskullanabilirsiniz JAXB. İşlemlerinizi XML formatına dönüştürmekle uğraşmaktan çok daha kolay.

Her şeyin bozulduğu yer, Ultra-Corp'un aslında kendi şartnamelerine uymadığı ve pricea olarak indirdikleri ticaretin xsd:floataslında a double!


1
Ayrıca, önce kod yapabileceğinizi unutmayın: fasulye ile başlayın, ihtiyacınız olursa şema oluşturun.
StaxMan

7

Neden JAXB'ye ihtiyacımız var? Web hizmetlerinin uzak bileşenleri (Java ile yazılmıştır), birbirleri arasında mesaj alışverişi yapmak için XML kullanır. Neden XML? Çünkü XML, sınırlı kaynaklara sahip Ağlarda mesaj alışverişi yapmak için hafif bir seçenek olarak kabul edilir. Çoğu zaman bu XML belgelerini nesnelere dönüştürmemiz gerekir ve bunun tersi de geçerlidir. Örneğin: Basit Java POJO Employee, Çalışan verilerini uzak bileşene (ayrıca bir Java programı) göndermek için kullanılabilir.

class Employee{
 String name;
 String dept;
 ....
}

Bu Pojo, aşağıdaki gibi XML belgesine dönüştürülmelidir (Marshall):

<Employee>
  <Name>...</Name>
  <Department>...</Department>
</Employee>

Ve uzak bileşende, XML belgesinden (Un-Marshall) Java nesnesine geri dönün.

JAXB nedir?

JAXB, bu Marshalling ve UnMarshalling işlemlerini gerçekleştirmek için bir kitaplık veya araçtır. Sizi bu kadar basit, bu baş ağrısından kurtarır.


4

Ayrıca JIBX'i de kontrol edebilirsiniz. Aynı zamanda OTA (Open Travel Alliance) konusunda uzmanlaşmış ve AXIS2 sunucuları tarafından desteklenen çok iyi bir xml veri bağlayıcıdır. Performans ve uyumluluk arıyorsanız, kontrol edebilirsiniz:

http://jibx.sourceforge.net/index.html


0

JAXB, varsayılan sıralama optimizasyonları aracılığıyla gelişmiş performans sağlar. JAXB, Java nesnelerini XML belgelerine okuma ve yazma için bir programcı API tanımlar, böylece Java aracılığıyla XML'in okunmasını ve yazılmasını basitleştirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.