Java'da XML serileştirme? [kapalı]


104

.NET'in XML serileştirmesinin Java analogu nedir?


7
Ah, bunun gibi tek satırlık soruların SO'da hoş karşılandığı muhteşem eski zamanlar. Çok kullanışlı. Tüm bu "Neyi denediniz?" / "Ayrıntıları sağlayın" saçmalığı olmadan insanlar bugün okumayı severler.
GOTO 0

Yanıtlar:


81

2008 Cevap Bunun için "Resmi" Java API'si artık JAXB - XML ​​Bağlama için Java API. Oracle'ın Eğitimi bölümüne bakın . Referans uygulama http://jaxb.java.net/ adresinde bulunmaktadır.

2018 Güncelleme geldiğini hatırlatırız Java EE ve CORBA Modülleri JDK9 içinde SE kaldırıldığını ve JDK11 SE'nin kaldırılacak . Bu nedenle, JAXB'yi kullanmak için ya uygulama sunucunuz tarafından paketlenmiş mevcut kurumsal sınıf ortamınızda olması ya da manuel olarak getirmeniz gerekir.


2
Doğru, JAXB kesinlikle en iyi seçenektir!
ivan_ivanovich_ivanoff

1
JAXB, Java 10'dan itibaren standart java dağıtımlarından kaldırılmıştır, bu da onu, halihazırda sizin için paketleyen bir bağlamda çalışmadığınız sürece, isterseniz uygulamanızla birlikte paketlemeniz gereken bir kitaplık haline getirir.
Theodore Murdock

69

XStream , çok fazla konfigürasyon ve para olmadan nesneyi XML'e serileştirmede oldukça iyidir! (BSD lisansı altındadır).

Onu projemizden birinde eski java serileştirmeyi değiştirmek için kullandık ve neredeyse kutudan çıktı.


3
Çok kullanışlıdır, ancak dize olmayan düğüm nesneleriyle JGraph gibi derlenmiş ağaç yapılarında problemler yaşayabilir.
mikek3332002

Diğer çözümlerden daha basit ve daha iyi
daitangio

XStream'i seviyorum. Tek sorun, gerçek XML'den önce neden bir karakter eklendiğini anlamıyorum.
James P.

17

"Basit XML Serileştirme" Projesi

Simple XML Serialization projesine bakmak isteyebilirsiniz . Net'teki System.Xml.Serialization'a bulduğum en yakın şey bu.


Ancak, her alan için eşleme ek açıklamaları gerektirir.
mP.

1
Doğru değil, ihtiyacım yok. Varsayılan davranışı değiştirebilirsiniz ve yalnızca mevcut alanları kullanır.
damluar

1
Ben de "Basit" i yürekten destekliyorum . Birkaç projede çok başarılı bir şekilde kullandım. "Basit" aslında JAXB'den çok daha basittir. Nispeten basit ihtiyaçlarınız olduğunda en uygunu: Daha sonra tekrar nesne olarak yeniden hidratlanmak üzere depoya yazılması gereken nesneler var. JAXB çok daha fazla özelliğe ve esnekliğe sahiptir, ancak bu "80/20" türü bir şeydir, çoğu projede çoğu zaman yalnızca basit özellik alt kümesine ihtiyaç duyabilirsiniz.
Basil Bourque

Yalnızca 1: 1 eşleme istiyorsanız iyi çalışır. Sınıflarınız gelişirse ve yine de eski XML'in serisini kaldırmanız gerekiyorsa sorunlarla karşılaşırsınız çünkü hem dokümantasyon hem de hata mesajları bir şekilde belirsizdir. Sorunu teşhis etmek genellikle yapılabilir, ancak nasıl çözüleceğini bulmak birkaç gün sürebilir.
toolforger

13

JAXB, JDK standart sürüm 1.6+ sürümünün bir parçasıdır. Yani FREEindirilecek ve yönetilecek fazladan kitaplıklar yoktur. Basit bir örnek burada bulunabilir

XStream ölmüş gibi görünüyor. Son güncelleme 6 Aralık 2008'de yapıldı. SimpleJAXB kadar kolay ve basit görünüyor, ancak kurumsal kullanım için değerlendirmek için herhangi bir lisans bilgisi bulamadım.


4
XStream ölmedi, sadece olgun ve kararlı - yani çekirdek işlevlere eklenecek çok şey yok. Aynısı aslında JAXB referans uygulaması için de geçerli, son birkaç yıldır pek fazla etkinlik yok.
StaxMan

9

1.4 sürümünden beri Java'nın java.beans.XMLEncoder ve java.beans.XMLDecoder sınıflarına sahip olduğunu belirtmek gerekir. Bu sınıflar, en azından XML Serileştirme ile çok karşılaştırılabilir olan XML kodlaması gerçekleştirir ve bazı durumlarda sizin için hile yapabilir.

Sınıfınız alıcıları ve ayarlayıcıları için JavaBeans belirtimine bağlı kalırsa, bu yöntemin kullanımı kolaydır ve bir şemaya ihtiyacınız yoktur. Aşağıdaki uyarılarla:

  • Normal Java serileştirmede olduğu gibi
    • bir InputStream ve OutputStream üzerinden çalıştırılan kodlama ve kod çözme
    • süreç, familar writeObject ve readObject yöntemlerini kullanır
  • Normal Java serileştirmenin aksine
    • kodlama ama aynı zamanda kod çözme, yapıcıların ve başlatıcıların çağrılmasına neden olur
    • kodlama ve kod çözme, sınıfınızın Serializable uygulayıp uygulamadığına bakılmaksızın çalışır
    • geçici değiştiriciler dikkate alınmaz
    • yalnızca genel oluşturucuları olan genel sınıflar için çalışır

Örneğin, aşağıdaki beyanı alın:

public class NPair {
  public NPair() { }
  int number1 = 0;
  int number2 = 0;
  public void setNumber1(int value) { number1 = value;}
  public int getNumber1() { return number1; }
  public void setNumber2(int value) { number2 = value; }
  public int getNumber2() {return number2;}
}

Bu kodu yürütmek:

NPair fe = new NPair();
fe.setNumber1(12);
fe.setNumber2(13);
FileOutputStream fos1 = new FileOutputStream("d:\\ser.xml");
java.beans.XMLEncoder xe1 = new java.beans.XMLEncoder(fos1);
xe1.writeObject(fe);
xe1.close();

Aşağıdaki dosyayla sonuçlanır:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_02" class="java.beans.XMLDecoder">
 <object class="NPair">
  <void property="number1">
   <int>12</int>
  </void>
  <void property="number2">
   <int>13</int>
  </void>
 </object>
</java>

Kullanarak unutmayın java.beans.XMLDecoderkullanıcı kaynaklı verilerle Kodunuzdaki rastgele kod çalıştırma açığı oluşturabilecek olabilir.
aventurin


0

Nesnelerin otomatik XML serileştirmesinden bahsediyorsanız, Castor'a bakın :

Castor, Java [tm] için bir Açık Kaynak veri bağlama çerçevesidir. Java nesneleri, XML belgeleri ve ilişkisel tablolar arasındaki en kısa yoldur. Castor, Java-XML bağlama, Java-SQL kalıcılığı ve daha fazlasını sağlar.


0

XML'e serileştirilebilir nesneler oluşturmam gerekirse, genellikle jaxb veya XMLBeans kullanırım . Şimdi, bunu görebiliyorum XStream o nonintrusive ve gerçekten basit api olduğu gibi çok yararlı olabilir. Yakında onunla oynayacağım ve muhtemelen kullanacağım. Fark ettiğim tek dezavantaj, çapraz referans için kendi başıma nesne kimliğini oluşturamayacağım.

@Barak Schiller XStream'e
bağlantı gönderdiğiniz için teşekkürler!


Sorun şu ki jaxb ve xmlbeans bir eşleme şeması gerektiriyor ve auto ...
mP yok.



-1
public static String genXmlTag(String tagName, String innerXml, String properties )
{
    return String.format("<%s %s>%s</%s>", tagName, properties, innerXml, tagName);
}

public static String genXmlTag(String tagName, String innerXml )
{
    return genXmlTag(tagName, innerXml, "");
}

public static <T> String serializeXML(List<T> list)
{
    String result = "";
    if (list.size() > 0)
    {
        T tmp = list.get(0);
        String clsName = tmp.getClass().getName();
        String[] splitCls = clsName.split("\\.");
        clsName = splitCls[splitCls.length - 1];
        Field[] fields = tmp.getClass().getFields();

        for (T t : list)
        {
            String row = "";
            try {
                for (Field f : fields)
                {
                    Object value = f.get(t);
                    row += genXmlTag(f.getName(), value == null ? "" : value.toString());
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            row = genXmlTag(clsName, row);

            result += row;
        }
    }

    result = genXmlTag("root", result);
    return result;
}

Birçok sorun: Sınıfın Yeniden Keşfi # getSimpleName *** PropertyDescriptor'ün Yeniden Keşfi *** Tüm özelliklerin erişilebilir alanlar olduğunu varsayar *** Yansıma sonuçlarını önbelleğe almaz (slooow) *** Herhangi bir şeyi özelleştirmenin yolu yoktur (örneğin, değiştirmem gerekir sınıf ve dosya adları) *** Serileştirme yok
toolforger
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.