"O kadar çabuk olma genç adam! Senin için iki dersim daha var!"

"İki mi? Vay canına. Pekala, tamam. Kendi soğukkanlılığını artırmak için ne yapmazdın! Seni dinliyorum."

"XML, JSON gibi, genellikle farklı programlar ve bilgisayarlar arasında veri aktarırken kullanılır. Ve Java programcılarının XML ile çalışırken hayatlarını büyük ölçüde kolaylaştıran birkaç çerçeve vardır. Bugün size bunlardan birini tanıtacağım."

"JAXB, XML ile çalışmak için mükemmel bir çok amaçlı çerçevedir."

JAXB - 1

"JAXB, JDK'nın bir parçasıdır, dolayısıyla onu ayrıca indirmenize gerek yoktur."

"Önce size nasıl kullanılacağına dair bir örnek göstereyim, sonra analiz ederiz. Örneğin:"

Bir nesneyi XML'e dönüştürme
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);
}
Nesneleri XML'e dönüştürülen bir sınıf
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}
Serileştirme sonucu ve ekran çıktısı:
<cat> 
<name> Missy </name> 
<age> 5 </age> 
<weight> 4 </weight> 
</cat>

"Nedense, bu kod bana JSON serileştirmesini satır satır hatırlatıyor. Aynı ek açıklamalar, ancak JSON bir ObjectMapper kullandı ve bu, Context ve Marshaller kullanıyor."

"Evet. Gerçekten çok benzerler. Jackson, JAXB'den sonra modellendi. Ama JAXB de bir yerlerden kopyalandı. Sıfırdan dahice bir şey icat edemezsin."

"Öyle görünüyor."

"Tamam, işte olanlar:"

"4-7. satırlarda, bir Cat nesnesi oluşturuyoruz ve onu verilerle dolduruyoruz."

"10. satırda, sonucu yazmak için bir Writer nesnesi oluşturuyoruz."

"13. satırda, 'bağlam'ı oluşturuyoruz. Bu, ObjectMapper'a benzer, ancak ondan iki ek alt nesne oluşturulur. Marshaller , serileştirme içindir ve Unmarshaller , serileştirme içindir. Jackson'dan küçük farklılıklar vardır, ancak temelde farklı."

"14. satırda, bir Marshaller nesnesi yaratıyoruz . Marshalling, serileştirmenin eşanlamlısıdır."

"15. satırda, FORMATTED_OUTPUT özelliğini TRUE olarak ayarladık. Bu, sonuca satır sonları ve boşluklar ekleyecek, böylece kod insanlar tarafından okunabilir olacak ve tüm metin tek bir satırda olmayacak."

"17. satırda nesneyi seri hale getiriyoruz."

"20-21 satırlarında ekranda serileştirmenin sonucunu gösteriyoruz."

"@XmlType(name = 'cat&') ve @XmlRootElement açıklamaları nelerdir?"

" @XmlRootElement, bu nesnenin XML öğelerinin 'bir ağacın kökü' olabileceğini belirtir. Diğer bir deyişle, en üst düzey öğe olabilir ve diğer tüm öğeleri içerebilir."

" @XmlType(name = 'cat'), sınıfın JAXB serileştirmesine dahil olduğunu belirtir ve ayrıca bu sınıf için XML etiketinin adını belirtir."

"Pekala, şimdi size XML serisini kaldırmanın bir örneğini göstereceğim:"

Bir nesneyi XML'den dönüştürme
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);
}
Nesneleri XML'den seri hale getirilen bir sınıf
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}

"Jackson'dakiyle hemen hemen her şey aynı. Ama ne olur ne olmaz, burada olan her şeyi açıklayacağım."

"3. satırda, seri durumdan çıkarılacak XML'i saklayan bir dize iletiyoruz ."

"4. satırda, XML dizesini bir StringReader içine sardık ."

"6. satırda, sınıf listesini ilettiğimiz bir JAXB bağlamı oluşturuyoruz ."

"7. satırda, bir Unmarshaller - seriden kaldırmayı gerçekleştirecek nesne - yaratıyoruz ."

"9. satırda, XML'i okuyucu nesnesinden seri durumdan çıkarıyoruz ve bir Cat nesnesi alıyoruz."

"Şimdi her şey neredeyse açık görünüyor. Ama birkaç saat önce, nasıl çalıştığını anlamak için beynimi zorluyordum."

"Daha akıllı olduğunuzda bu her zaman olur. Karmaşık şeyler basitleşir."

"Daha akıllı hale geliyor muyum? Buna sevinmeden edemiyorum."

"Harika. O halde, JAXB serileştirmenin sonucunu kontrol etmek için kullanabileceğiniz ek açıklamaların bir listesi:"

JAXB notları Tanım
@XmlElement(isim) Bir alanın yakınına yerleştirildi.
Alan bir XML öğesinde saklanacaktır.
Etiketin adını belirlemenizi sağlar.
@XmlAttribute(ad) Bir alanın yakınına yerleştirildi.
Alan bir XML özniteliği olarak saklanacak!
Özniteliğin adını belirlemenizi sağlar.
@XmlElementWrapper(sıfırlanabilir = doğru) Bir alanın yakınına yerleştirildi.
Bir grup öğe için bir 'sarmalayıcı etiketi' belirlemenizi sağlar.
@XmlType Bir sınıfın yanına yerleştirildi.
Varsayılan oluşturucu özel ise, bir nesne oluşturmak için bir yöntem belirtmenizi sağlar.
@XmlJavaTypeAdapter Bir alanın yakınına yerleştirildi.
Alanı bir dizgeye dönüştürecek sınıfı belirtmenizi sağlar.

"Ne kadar ilginç! Ama bana bu ek açıklamaları kullanan bir örnek verebilir misiniz? Açıklama bir şeydir, ancak çalışan bir örnek başka bir şeydir."

"Tamam. Size bir örnek göstereceğim. JAXB'nin alanlar yerine alıcı/ayarlayıcı yöntemlerine açıklama eklemenize izin verdiğini eklemek istedim."

"İşte söz verdiğim örnek:"

Bir nesneyi XML'e dönüştürme
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());
}
Nesneleri XML'e dönüştürülen bir sınıf
@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()
 {
 }
}
Serileştirme sonucu ve ekran çıktısı:
< 
hayvanat bahçesi> <vahşi hayvanlar 
> <kaplan yaşı = "5" w = "4"> 
<catname>Missy</catname> 
</tiger> 
<tiger age = "5" w = "4"> 
<catname>Missy </catname> 
</tiger> < 
/vahşi hayvanlar> 
</zoo>

"Bu sefer bir Cat nesnesini değil, bir Cat nesneleri koleksiyonunu depolayan bir Zoo nesnesini serileştirdiğimize dikkat edin."

"cat nesnesi koleksiyona iki kez eklendi, yani xml'de iki kez."

"Koleksiyonun, koleksiyonun tüm öğelerini saran kendi ' vahşi hayvanlar ' etiketi var."

" Yaş ve ağırlık öğeleri, yaş ve ağırlık özellikleri haline geldi ."

"Bir @XmlElement özniteliği kullanarak, kedi etiketini bir kaplan etiketi olarak değiştirdik ."

"17. satıra dikkat edin. Burada iki sınıfı ( Zoo ve Cat ) JAXB bağlamına geçiriyoruz , çünkü her ikisi de serileştirmeye dahil."

"Bugün çok ilginç bir gündü. Çok fazla yeni bilgi var."

"Evet. Senin adına sevindim. Şimdi biraz ara ver, devam edelim."