.NET'in XML serileştirmesinin Java analogu nedir?
.NET'in XML serileştirmesinin Java analogu nedir?
Yanıtlar:
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.
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ı.
Simple XML Serialization projesine bakmak isteyebilirsiniz . Net'teki System.Xml.Serialization'a bulduğum en yakın şey bu.
JAXB, JDK standart sürüm 1.6+ sürümünün bir parçasıdır. Yani FREE
indirilecek 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ı.
Simple
JAXB kadar kolay ve basit görünüyor, ancak kurumsal kullanım için değerlendirmek için herhangi bir lisans bilgisi bulamadım.
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:
Ö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>
java.beans.XMLDecoder
kullanıcı kaynaklı verilerle Kodunuzdaki rastgele kod çalıştırma açığı oluşturabilecek olabilir.
XMLBeans, XML'iniz için bir şemanız varsa harika çalışıyor. Şema için Java nesneleri oluşturur ve kullanımı kolay ayrıştırma yöntemleri oluşturur.
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.
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!
yapılandırılmış bir çözüm istiyorsanız (ORM gibi), o zaman JAXB2 iyi bir çözümdür.
DOT NET gibi bir serileştirme istiyorsanız , JavaBeans Bileşenlerinin Uzun Süreli Kalıcılığını kullanabilirsiniz .
Seçim, serileştirmenin kullanımına bağlıdır.
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;
}