Tương tự Java của tuần tự hóa XML của .NET là gì?
Tương tự Java của tuần tự hóa XML của .NET là gì?
Câu trả lời:
2008 Trả lời API Java "Chính thức" cho việc này hiện là JAXB - Java API cho XML Binding. Xem Hướng dẫn của Oracle . Việc triển khai tham chiếu có tại http://jaxb.java.net/
Cập nhật 2018 Lưu ý rằng các Mô-đun Java EE và CORBA không được dùng trong SE trong JDK9 và sẽ bị xóa khỏi SE trong JDK11 . Do đó, để sử dụng JAXB, nó sẽ cần phải ở trong môi trường lớp doanh nghiệp hiện có của bạn được đóng gói bởi máy chủ ứng dụng của bạn, hoặc bạn sẽ cần phải đưa nó vào theo cách thủ công.
XStream khá tốt trong việc tuần tự hóa đối tượng sang XML mà không cần nhiều cấu hình và tiền bạc! (nó theo giấy phép BSD).
Chúng tôi đã sử dụng nó trong một dự án của mình để thay thế tuần tự hóa java cũ thuần túy và nó hoạt động gần như không có gì.
Bạn có thể muốn xem dự án Đơn giản hóa chuỗi tuần tự XML . Nó là thứ gần nhất mà tôi tìm thấy với System.Xml.Serialization trong .Net.
JAXB là một phần của phiên bản tiêu chuẩn JDK phiên bản 1.6+. Vì vậy, nó là FREE
và không có thư viện bổ sung để tải xuống và quản lý. Một ví dụ đơn giản có thể được tìm thấy ở đây
XStream dường như đã chết. Lần cập nhật cuối cùng vào ngày 6 tháng 12 năm 2008.
Simple
Có vẻ dễ dàng và đơn giản hơn JAXB nhưng tôi không thể tìm thấy bất kỳ thông tin cấp phép nào để đánh giá nó cho mục đích sử dụng của doanh nghiệp.
Đáng nói là từ phiên bản 1.4, Java đã có các lớp java.beans.XMLEncoder và java.beans.XMLDecoder. Các lớp này thực hiện mã hóa XML mà ít nhất là rất tương đương với XML Serialization và trong một số trường hợp có thể thực hiện thủ thuật cho bạn.
Nếu lớp của bạn dính vào đặc tả JavaBeans cho các getters và setters của nó, thì phương thức này rất dễ sử dụng và bạn không cần lược đồ. Với những lưu ý sau:
Ví dụ, lấy khai báo sau:
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;}
}
Đang thực thi mã này:
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();
Sẽ dẫn đến tệp sau:
<?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
với dữ liệu do người dùng cung cấp có thể tạo ra các lỗ hổng thực thi mã tùy ý trong mã của bạn.
XMLBeans hoạt động tốt nếu bạn có một lược đồ cho XML của mình. Nó tạo các đối tượng Java cho lược đồ và tạo các phương thức phân tích cú pháp dễ sử dụng.
Nếu bạn đang nói về tuần tự hóa XML tự động của các đối tượng, hãy xem Castor :
Castor là một khung liên kết dữ liệu Nguồn mở cho Java [tm]. Đó là đường dẫn ngắn nhất giữa các đối tượng Java, tài liệu XML và các bảng quan hệ. Castor cung cấp liên kết Java-với-XML, tính bền vững của Java-to-SQL và hơn thế nữa.
Thông thường tôi sử dụng jaxb hoặc XMLBeans nếu tôi cần tạo các đối tượng có thể tuần tự hóa thành XML. Bây giờ, tôi có thể thấy XStream đó có thể rất hữu ích vì nó không có tác dụng và có api thực sự đơn giản. Tôi sẽ sớm chơi với nó và có thể sẽ sử dụng nó. Hạn chế duy nhất mà tôi nhận thấy là tôi không thể tự tạo id của đối tượng để tham khảo chéo.
@Barak Schiller
Cảm ơn bạn đã đăng liên kết tới XStream!
nếu bạn muốn một giải pháp có cấu trúc (như ORM) thì JAXB2 là một giải pháp tốt.
Nếu bạn muốn tuần tự hóa như DOT NET thì bạn có thể sử dụng Tính bền lâu dài của các thành phần JavaBeans
Sự lựa chọn phụ thuộc vào việc sử dụng tuần tự hóa.
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;
}