Serialisasi XML di Jawa? [Tutup]

104

Apa analogi Java dari serialisasi XML .NET?

Dmitry Shechtman
sumber
6
Ah, masa lalu yang mulia ketika pertanyaan satu kalimat seperti ini diterima di SO. Sangat berguna. Tanpa semua kalimat "Apa yang sudah Anda coba?" / "Berikan detail" yang suka dibaca orang hari ini.
GOTO 0

Jawaban:

81

2008 Answer The "Official" Java API untuk ini sekarang JAXB - Java API for XML Binding. Lihat Tutorial oleh Oracle . Implementasi referensi ada di http://jaxb.java.net/

Pembaruan 2018 Perhatikan bahwa Java EE dan CORBA Modules tidak digunakan lagi di SE di JDK9 dan akan dihapus dari SE di JDK11 . Oleh karena itu, untuk menggunakan JAXB, JAXB harus berada di lingkungan kelas perusahaan yang ada yang dipaketkan oleh misalnya server aplikasi Anda, atau Anda harus membawanya secara manual.

Cheekysoft
sumber
2
Benar, JAXB jelas merupakan pilihan terbaik!
ivan_ivanovich_ivanoff
1
JAXB telah dihapus dari distribusi java standar pada Java 10, yang membuatnya sekarang menjadi perpustakaan yang harus Anda bundel dengan aplikasi Anda jika Anda menginginkannya, kecuali Anda beroperasi dalam konteks yang sudah menggabungkannya untuk Anda.
Theodore Murdock
69

XStream cukup bagus dalam membuat serial objek ke XML tanpa banyak konfigurasi dan uang! (di bawah lisensi BSD).

Kami menggunakannya di salah satu proyek kami untuk menggantikan serialisasi java lama dan bekerja hampir di luar kotak.

Barak Schiller
sumber
3
Sangat berguna, ini dapat memiliki masalah pada struktur pohon yang rumit seperti JGraph dengan objek node non string.
mikek3332002
Lebih sederhana dan lebih baik daripada solusi lain
daitangio
Saya suka XStream. Hanya masalahnya adalah saya tidak mengerti mengapa karakter ditambahkan sebelum XML yang sebenarnya.
James P.
17

Proyek "Serialisasi XML Sederhana"

Anda mungkin ingin melihat proyek Serialisasi XML Sederhana . Ini adalah hal terdekat yang saya temukan ke System.Xml.Serialization di .Net.

ARKBAN
sumber
Namun itu membutuhkan anotasi pemetaan untuk setiap bidang.
mP.
1
Tidak benar, saya tidak membutuhkan. Anda dapat mengubah perilaku default dan ini hanya akan menggunakan bidang yang ada.
damluar
1
Saya juga sangat mendukung "Sederhana" . Saya telah menggunakannya pada beberapa proyek dengan kesuksesan besar. "Sederhana" memang jauh lebih sederhana dari JAXB. Paling tepat bila Anda memiliki kebutuhan yang relatif sederhana: Punya benda yang perlu ditulis ke penyimpanan untuk nanti dihidrasi kembali sebagai benda lagi. JAXB memiliki lebih banyak fitur dan fleksibilitas, tetapi ini adalah jenis "80/20", sebagian besar waktu di sebagian besar proyek Anda mungkin hanya memerlukan subset fitur sederhana.
Basil Bourque
Berfungsi dengan baik jika Anda hanya menginginkan pemetaan 1: 1. Jika kelas Anda berkembang dan Anda masih perlu melakukan deserialisasi XML lama, Anda mengalami masalah karena dokumentasi dan pesan kesalahan agak kabur. Mendiagnosis masalah biasanya dapat dilakukan, tetapi mencari cara untuk memperbaikinya dapat memakan waktu beberapa hari.
toolforger
13

JAXB adalah bagian dari edisi standar JDK versi 1.6+. Begitulah FREEdan tidak ada perpustakaan tambahan untuk diunduh dan dikelola. Contoh sederhana dapat ditemukan di sini

XStream sepertinya sudah mati. Pembaruan terakhir pada 6 Desember 2008. SimpleTampaknya semudah dan sesederhana JAXB tetapi saya tidak dapat menemukan informasi perizinan untuk mengevaluasinya untuk penggunaan perusahaan.

so_mv
sumber
4
XStream tidak mati, itu hanya matang dan stabil - artinya tidak banyak yang bisa ditambahkan ke fungsionalitas inti. Hal yang sama juga berlaku untuk implementasi referensi JAXB, tidak banyak aktivitas selama beberapa tahun terakhir.
StaxMan
9

Perlu disebutkan bahwa sejak versi 1.4, Java memiliki kelas java.beans.XMLEncoder dan java.beans.XMLDecoder. Kelas-kelas ini melakukan pengkodean XML yang setidaknya sangat sebanding dengan Serialisasi XML dan dalam beberapa keadaan mungkin melakukan trik untuk Anda.

Jika kelas Anda tetap berpegang pada spesifikasi JavaBeans untuk getter dan setternya, metode ini mudah digunakan dan Anda tidak memerlukan skema. Dengan peringatan berikut:

  • Seperti serialisasi Java biasa
    • coding dan decoding dijalankan melalui InputStream dan OutputStream
    • prosesnya menggunakan metode familar writeObject dan readObject
  • Berbeda dengan serialisasi Java biasa
    • encoding tetapi juga decoding menyebabkan konstruktor dan penginisialisasi dipanggil
    • encoding dan decoding bekerja terlepas dari apakah kelas Anda mengimplementasikan Serializable atau tidak
    • pengubah sementara tidak diperhitungkan
    • bekerja hanya untuk kelas publik, yang memiliki konstruktor publik

Misalnya, ambil deklarasi berikut:

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;}
}

Menjalankan kode ini:

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();

Akan menghasilkan file berikut:

<?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>
Mishax
sumber
Ketahuilah bahwa menggunakan java.beans.XMLDecoderdengan data yang diberikan pengguna dapat menyebabkan kerentanan eksekusi kode arbitrer dalam kode Anda.
aventurin
2

XMLBeans berfungsi dengan baik jika Anda memiliki skema untuk XML Anda. Ini membuat objek Java untuk skema dan membuat metode parse yang mudah digunakan.

John Meagher
sumber
0

Jika Anda berbicara tentang serialisasi XML otomatis pada objek, lihat Castor :

Castor adalah kerangka kerja pengikatan data Sumber Terbuka untuk Java [tm]. Ini adalah jalur terpendek antara objek Java, dokumen XML, dan tabel relasional. Castor menyediakan pengikatan Java-ke-XML, persistensi Java-ke-SQL, dan banyak lagi.

Theo
sumber
0

Biasanya saya menggunakan jaxb atau XMLBeans jika saya perlu membuat objek serializable ke XML. Sekarang, saya dapat melihat bahwa XStream mungkin sangat berguna karena tidak mengganggu dan memiliki api yang sangat sederhana. Saya akan segera memainkannya dan mungkin akan menggunakannya. Satu-satunya kelemahan yang saya perhatikan adalah saya tidak dapat membuat id objek sendiri untuk referensi silang.

@Barak Schiller
Terima kasih telah memposting tautan ke XStream!

Bartosz Bierkowski
sumber
Masalahnya adalah jaxb dan xmlbeans memerlukan skema pemetaan dan tidak otomatis ...
mP.
0

jika Anda menginginkan solusi terstruktur (seperti ORM) maka JAXB2 adalah solusi yang baik.

Jika Anda menginginkan serialisasi seperti DOT NET maka Anda dapat menggunakan Long Term Persistence of JavaBeans Components

Pilihannya tergantung pada penggunaan serialisasi.

m.genova
sumber
-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;
}
pengguna4067649
sumber
Banyak masalah: Penemuan Kembali Kelas # getSimpleName *** Penemuan kembali PropertyDescriptor *** Mengasumsikan semua properti adalah bidang yang dapat diakses *** Tidak menyimpan hasil refleksi (sloow) *** Tidak ada cara untuk menyesuaikan apapun (misalnya saya harus mengganti kelas dan nama file) *** Tidak ada deserialization
toolforger