Tuần tự hóa XML trong Java? [đóng cửa]


104

Tương tự Java của tuần tự hóa XML của .NET là gì?


6
Ah, thời kỳ huy hoàng khi những câu hỏi đơn lẻ như thế này được chào đón trên SO. Rất hữu ích. Nếu không có tất cả những thứ đó "Bạn đã thử gì?" / "Cung cấp thông tin chi tiết" những người vô nghĩa thích đọc ngày hôm nay.
GOTO 0

Câu trả lời:


81

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.


2
Đúng vậy, JAXB chắc chắn là lựa chọn tốt nhất!
ivan_ivanovich_ivanoff

1
JAXB đã bị xóa khỏi các bản phân phối java tiêu chuẩn kể từ Java 10, điều này làm cho nó giờ đây trở thành một thư viện mà bạn phải đóng gói với ứng dụng của mình nếu bạn muốn, trừ khi bạn đang hoạt động trong một ngữ cảnh đã đóng gói nó cho bạn.
Theodore Murdock

69

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ì.


3
Rất hữu ích, nó có thể gặp sự cố trên cấu trúc cây hoàn chỉnh như JGraph với các đối tượng không phải là nút chuỗi.
mikek3332002

Đơn giản hơn và giải pháp tốt hơn sau đó khác
daitangio

Tôi thích XStream. Chỉ có điều là tôi không hiểu tại sao một ký tự lại được thêm vào trước XML thực tế.
James P.

17

Dự án "Tuần tự hóa XML đơn giản"

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.


Tuy nhiên, nó yêu cầu các chú thích ánh xạ cho mỗi trường.
mP.

1
Không đúng, tôi không yêu cầu. Bạn có thể thay đổi hành vi mặc định và nó sẽ chỉ sử dụng các trường hiện tại.
damluar

1
Tôi cũng chân thành tán thành "Đơn giản" . Tôi đã sử dụng nó cho một vài dự án thành công rực rỡ. "Đơn giản" là thực sự đơn giản hơn nhiều JAXB. Thích hợp nhất khi bạn có nhu cầu tương đối đơn giản: Có các đối tượng cần được ghi vào bộ nhớ để sau này được hydrat hóa lại thành các đối tượng một lần nữa. JAXB có nhiều tính năng và tính linh hoạt hơn, nhưng đó là một loại "80/20", hầu hết thời gian trong hầu hết các dự án, bạn có thể chỉ cần tập hợp con các tính năng đơn giản.
Basil Bourque vào

Hoạt động tốt nếu bạn chỉ muốn ánh xạ 1: 1. Nếu các lớp của bạn phát triển và bạn vẫn cần giải mã XML cũ, bạn sẽ gặp phải sự cố vì cả tài liệu và thông báo lỗi đều hơi mơ hồ. Việc chẩn đoán vấn đề thường có thể làm được, nhưng việc tìm ra cách khắc phục có thể mất vài ngày.
toolforger

13

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à FREEvà 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. SimpleCó 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.


4
XStream chưa chết, nó chỉ trưởng thành và ổn định - có nghĩa là không có nhiều thứ để thêm vào chức năng cốt lõi. Điều tương tự cũng đúng với việc triển khai tham chiếu JAXB, không có nhiều hoạt động trong vài năm qua.
StaxMan

9

Đá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:

  • Như với tuần tự hóa Java thông thường
    • mã hóa và giải mã chạy qua InputStream và OutputStream
    • quá trình sử dụng các phương thức writeObject và readObject quen thuộc
  • Ngược lại với tuần tự hóa Java thông thường
    • mã hóa mà còn giải mã khiến các hàm tạo và trình khởi tạo được gọi
    • mã hóa và giải mã hoạt động bất kể lớp của bạn có triển khai Serializable hay không
    • các công cụ sửa đổi nhất thời không được tính đến
    • chỉ hoạt động cho các lớp công khai, có hàm tạo công cộng

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>

Lưu ý rằng việc sử dụng java.beans.XMLDecodervớ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.
aventurin

2

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.


0

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.


0

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!


Vấn đề là jaxb và xmlbeans yêu cầu một lược đồ ánh xạ và không tự động ...
mP.



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

Nhiều vấn đề: Phát minh lại Lớp # getSimpleName *** Phát minh lại PropertyDescriptor *** Giả sử tất cả các thuộc tính là các trường có thể truy cập *** Không lưu kết quả phản chiếu bộ nhớ cache (slooow) *** Không có cách nào để tùy chỉnh bất kỳ thứ gì (ví dụ: tôi cần thay thế lớp và tên tập tin) *** Không deserialization
toolforger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.