Apa analogi Java dari serialisasi XML .NET?
Apa analogi Java dari serialisasi XML .NET?
Jawaban:
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.
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.
Anda mungkin ingin melihat proyek Serialisasi XML Sederhana . Ini adalah hal terdekat yang saya temukan ke System.Xml.Serialization di .Net.
JAXB adalah bagian dari edisi standar JDK versi 1.6+. Begitulah FREE
dan tidak ada perpustakaan tambahan untuk diunduh dan dikelola. Contoh sederhana dapat ditemukan di sini
XStream sepertinya sudah mati. Pembaruan terakhir pada 6 Desember 2008.
Simple
Tampaknya semudah dan sesederhana JAXB tetapi saya tidak dapat menemukan informasi perizinan untuk mengevaluasinya untuk penggunaan perusahaan.
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:
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>
java.beans.XMLDecoder
dengan data yang diberikan pengguna dapat menyebabkan kerentanan eksekusi kode arbitrer dalam kode Anda.
XMLBeans berfungsi dengan baik jika Anda memiliki skema untuk XML Anda. Ini membuat objek Java untuk skema dan membuat metode parse yang mudah digunakan.
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.
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!
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.
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;
}