อะนาล็อก Java ของการทำให้อนุกรม XML ของ. NET คืออะไร
อะนาล็อก Java ของการทำให้อนุกรม XML ของ. NET คืออะไร
คำตอบ:
2008 คำตอบ Java API "อย่างเป็นทางการ" สำหรับตอนนี้คือ JAXB - Java API สำหรับการเชื่อม XML ดูการสอนโดยออราเคิล การใช้งานอ้างอิงอยู่ที่http://jaxb.java.net/
2018 ปรับปรุง ทราบว่าชวา EE และ CORBA โมดูลจะเลิกใช้ใน SE ใน JDK9 และจะถูกลบออกจาก SE ใน JDK11 ดังนั้นในการใช้ JAXB จึงจำเป็นต้องอยู่ในสภาพแวดล้อมระดับองค์กรที่มีอยู่ซึ่งรวมอยู่ในเซิร์ฟเวอร์แอปเช่นของคุณหรือคุณจะต้องนำเข้ามาด้วยตนเอง
XStreamค่อนข้างดีในการทำให้วัตถุเป็นอนุกรมเป็น XML โดยไม่ต้องกำหนดค่าและเงินมาก (อยู่ภายใต้ใบอนุญาต BSD)
เราใช้มันในโปรเจ็กต์หนึ่งของเราเพื่อแทนที่ java-serialization แบบเดิม ๆ และมันก็ใช้งานได้เกือบหมดกล่อง
คุณอาจต้องการที่จะมองไปที่อันดับที่เรียบง่าย XMLโครงการ มันเป็นสิ่งที่ใกล้เคียงที่สุดที่ฉันพบกับ System.Xml.Serialization ใน. Net
JAXB เป็นส่วนหนึ่งของ JDK standard edition เวอร์ชัน 1.6+ ดังนั้นจึงFREE
ไม่มีไลบรารีเพิ่มเติมให้ดาวน์โหลดและจัดการ ตัวอย่างง่ายๆสามารถพบได้ที่นี่
XStream ดูเหมือนจะตายไปแล้ว อัปเดตล่าสุดเมื่อวันที่ 6 ธันวาคม 2008
Simple
ดูเหมือนว่าจะง่ายและง่ายกว่า JAXB แต่ฉันไม่พบข้อมูลการอนุญาตให้ใช้สิทธิ์ใด ๆ เพื่อประเมินการใช้งานในองค์กร
ควรค่าแก่การกล่าวถึงว่าตั้งแต่เวอร์ชัน 1.4 Java มีคลาส java.beans.XMLEncoder และ java.beans.XMLDecoder คลาสเหล่านี้ทำการเข้ารหัส XML ซึ่งอย่างน้อยก็เทียบได้กับ XML Serialization และในบางสถานการณ์อาจทำเคล็ดลับสำหรับคุณ
หากคลาสของคุณยึดติดกับข้อกำหนด JavaBeans สำหรับ getters และ setters วิธีนี้ใช้งานง่ายและคุณไม่จำเป็นต้องมีสคีมา ด้วยคำเตือนต่อไปนี้:
ตัวอย่างเช่นรับคำประกาศต่อไปนี้:
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;}
}
การเรียกใช้รหัสนี้:
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();
จะส่งผลให้เกิดไฟล์ต่อไปนี้:
<?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
ข้อมูลที่ผู้ใช้ให้มาอาจทำให้เกิดช่องโหว่ในการใช้รหัสโดยอำเภอใจในรหัสของคุณ
XMLBeansทำงานได้ดีถ้าคุณมีสคีมาสำหรับ XML ของคุณ สร้างวัตถุ Java สำหรับสคีมาและสร้างวิธีการแยกวิเคราะห์ที่ใช้งานง่าย
หากคุณกำลังพูดถึงการจัดลำดับวัตถุ XML โดยอัตโนมัติลองดูCastor :
Castor เป็นเฟรมเวิร์กการผูกข้อมูลโอเพ่นซอร์สสำหรับ Java [tm] เป็นเส้นทางที่สั้นที่สุดระหว่างวัตถุ Java เอกสาร XML และตารางเชิงสัมพันธ์ Castor จัดเตรียมการรวม Java-to-XML, การคงอยู่ของ Java-to-SQL และอื่น ๆ
โดยปกติแล้วฉันจะใช้jaxbหรือXMLBeansหากฉันต้องการสร้างอ็อบเจกต์ต่อเนื่องกับ XML ตอนนี้ฉันเห็นแล้วว่าXStreamอาจมีประโยชน์มากเพราะไม่เป็นการรบกวนและมี API ที่เรียบง่ายจริงๆ ฉันจะเล่นกับมันเร็ว ๆ นี้และอาจใช้มัน ข้อเสียเปรียบเพียงประการเดียวที่ฉันสังเกตเห็นคือฉันไม่สามารถสร้าง id ของวัตถุด้วยตัวเองสำหรับการอ้างอิงข้าม
@Barak Schiller
ขอบคุณสำหรับการโพสต์ลิงก์ไปยัง XStream!
หากคุณต้องการโซลูชันที่มีโครงสร้าง (เช่น ORM) JAXB2 เป็นทางออกที่ดี
หากคุณต้องการอนุกรมเช่น DOT NET คุณสามารถใช้Long Term Persistence ของ JavaBeans Components
ทางเลือกขึ้นอยู่กับการใช้การทำให้เป็นอนุกรม
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;
}