XMLEncoder có thể được sử dụng cho bất kỳ lớp nào, bao gồm cả người dùng xác định - bài viết bạn đề cập chi tiết cách thực hiện, nhưng nó không được viết rất tốt để có thể hơi khó hiểu.
Nếu lớp do người dùng xác định của bạn theo sau JavaBeans spec, thì bạn chỉ có thể sử dụng encoder.writeObject()
để tuần tự hóa một phiên bản List<Foo>
. Điều này là do đầu ra XML chỉ là một loạt các hướng dẫn về cách tạo lại cá thể đã cho lúc chạy. PersistenceDelegate mặc định biết cách serialize cấu trúc List, nhưng chỉ có hành vi mặc định cho các lớp không xác định. Theo mặc định, nó cố gắng tạo lại một cá thể đối tượng cụ thể bằng cách gọi hàm tạo nullary (no-argument) của nó, và sau đó thiết lập các thuộc tính của nó từng cái một với các giá trị của cá thể đã cho - một thứ được bảo đảm là có thể nếu lớp đó là một JavaBean.
Nếu lớp học của bạn có một số thuộc tính chỉ đọc, tức là chúng được thiết lập bởi hàm tạo và không thể thay đổi sau thời gian xây dựng, thì bạn phải làm (hơi) nhiều hơn để làm cho nó hoạt động. Bạn có thể tạo một thể hiện tùy chỉnh của DefaultPersistenceDelegate để nhận biết lớp của bạn và biết cách truyền dữ liệu thích hợp cho hàm khởi tạo của nó - bạn chỉ cần chuyển tên của thuộc tính vào danh sách, và nó sẽ thực hiện phần còn lại:
PersistenceDelegate fooDelegate = new DefaultPersistenceDelegate(new String[] {"propertyName1", "propertyName2"});
encoder.setPersistenceDelegate(Foo.class, fooDelegate);
Nếu lớp của bạn có đối số hàm tạo không trực tiếp ánh xạ tới thuộc tính bằng phương thức getter và/hoặc có các phức tạp khác để khôi phục trạng thái đối tượng, bạn có thể làm việc xung quanh bằng cách mở rộng PersistenceDelegate và thực hiện hành vi cần thiết.Tuy nhiên, nếu lớp của bạn rất phức tạp để tái tạo khi chạy và bạn muốn nó được sắp xếp theo thứ tự, bạn nên cân nhắc thiết kế lại nó để giảm độ phức tạp của nó - điều này sẽ làm cho toàn bộ quá trình trở nên dễ dàng hơn, và sẽ giảm thiểu cơ hội lỗi cũng như làm cho nó dễ dàng hơn để thay đổi và mở rộng trong tương lai.
Tôi thấy điều này không hoạt động, ví dụ xstream đã hoạt động tốt mặc dù – Sara
Chính xác thì điều gì không hiệu quả với bạn? Tôi trích xuất này từ mã ví dụ làm việc. Bạn đã thực hiện các getters và setters trong TestBean? Tôi chỉ chèn một bình luận thích hợp cho điều đó. – vanje
Triển khai này hoạt động đối với các lớp được mã hóa theo quy ước JavaBeans, nhưng đối với các lớp do người dùng định nghĩa tùy ý, cần đảm bảo rằng XMLEncoder có đúng PersistenceDelegates tại chỗ. Không phải tất cả các lớp đều có các thuộc tính và không phải tất cả các thuộc tính đều có thể ghi được - lớp của bạn càng thêm từ quy ước JavaBeans, bạn càng phải nỗ lực nhiều hơn. – Johansensen