2009-12-15 28 views
5

Tôi đang cố gắng sử dụng Simple XML serializer. Tôi quan tâm hơn đến việc deserialization từ XML-> Java. Đây là mã của tôi như là một thử nghiệm đơn vị:Đơn giản hóa việc deserialization XML

import java.io.StringReader; 
import java.io.StringWriter; 

import junit.framework.TestCase; 

import org.simpleframework.xml.Attribute; 
import org.simpleframework.xml.Root; 
import org.simpleframework.xml.Serializer; 
import org.simpleframework.xml.core.Persister; 

public class SimpleTest extends TestCase { 
    public void testWriting() throws Exception { 
     StringWriter writer = new StringWriter(); 
     Address address = new Address("1234 Main Street", "San Francisco", "CA"); 
     Serializer serializer = new Persister(); 

     serializer.write(address, writer); 
     System.out.println("Wrote: " + writer.getBuffer()); 
    } 

    public void testReading() throws Exception { 
     String input = "<address street='1234 Main Street' city='San Francisco' state='CA'/>"; 
     Serializer serializer = new Persister(); 
     System.out.println("Read back: " + serializer.read(Address.class, new StringReader(input))); 
    } 
} 

@Root 
class Address { 
    @Attribute(name="street") 
    private final String street; 

    @Attribute(name="city") 
    private final String city; 

    @Attribute(name="state") 
    private final String state; 

    public Address(@Attribute(name="street") String street, @Attribute(name="city") String city, @Attribute(name="state") String state) { 
     super(); 
     this.street = street; 
     this.city = city; 
     this.state = state; 
    } 

    @Override 
    public String toString() { 
     return "Address [city=" + city + ", state=" + state + ", street=" + street + "]"; 
    } 
} 

này hoạt động, nhưng lặp đi lặp lại @Attribute chú thích (ở lĩnh vực này và tại đối số nhà xây dựng) trong lớp Địa chỉ trông xấu xí. Có cách nào để:

  • chỉ đơn giản là tìm ra tên thuộc tính từ tên trường?
  • có tuần tự bỏ qua đơn giản, để tôi có thể lấy đi chú thích hoặc là các trường hoặc đối số hàm tạo?
+3

Nếu bạn đang tìm kiếm dễ dàng XML-> Java deserialization và không gắn liền với một gói cụ thể, đây là một thay thế: http://sourceforge.net/projects/practicalxml/ (lưu ý rằng tôi đã không đặt này như một câu trả lời bởi vì bạn dường như rất vui vẻ, đó không phải là cách tốt để đối xử với những người đang cố gắng giúp bạn) – kdgregory

+0

@kdgregory Cảm ơn, tôi không gắn với một gói cụ thể - Tôi sẽ xem qua tệp thực hành. Xin vui lòng không lấy downvotes quá cá nhân - những đề nghị được cung cấp không có nơi nào gần giải quyết vấn đề của tôi và đã ồn ào, IMO. –

+1

@kdgregory Ngày thứ hai suy nghĩ, tôi đã quá downvote hạnh phúc. Xin lỗi mọi người. –

Trả lời

1

Tôi không nghĩ rằng bạn cần tất cả sự lặp lại đó và thuộc tính bổ sung của chú thích. Nếu tên giống với thuộc tính đối tượng, tên này sẽ được sử dụng theo mặc định.

vì vậy bạn chỉ có thể khai báo nó như:

@Root 
class Address { 
    @Attribute 
    private final String street; 

    @Attribute 
    private final String city; 

    @Attribute 
    private final String state; 

    public Address(String street, String city, String state) { 
     super(); 
     this.street = street; 
     this.city = city; 
     this.state = state; 
    } 

    @Override 
    public String toString() { 
     return "Address [city=" + city + ", state=" + state + ", street=" + street + "]"; 
    } 
} 
+0

Không, điều đó không hoạt động, ít nhất là trong 2.1.3 đơn giản. –

+0

Tệ của tôi, tôi đã không chú ý kỹ hơn rằng bạn muốn có một Địa chỉ bất biến. Dựa trên đơn giản hiện tại, bạn sẽ cần phải sao chép thẻ @Attribute, vì nó đã sử dụng chú thích trên thuộc tính để tuần tự hóa và hàm tạo để deserializing. Bạn có thể lấy đi mà không có thẻ tên trên thuộc tính nhưng không phải trên các tham số hàm tạo, vì trình biên dịch chỉ theo dõi nó theo thứ tự thay vì theo tên. –

+0

Phụ thuộc vào mục tiêu bạn đang cố đạt được. Tất nhiên bạn có thể làm cho lớp có thể thay đổi và thực thi tính bất biến theo cách thủ công trong setter. Nhưng sau đó một lần nữa, mã sẽ trở nên xấu xí. Giữa hai, tôi có thể chỉ cần đi với tùy chọn chú thích đôi. –

0

Java sẽ serialize tất cả các thành viên lớp học của bạn theo mặc định nếu họ thực hiện Serializable và tuân thủ các cú pháp JavaBean.

+0

Tôi nghĩ bạn hiểu sai câu hỏi. Tôi muốn một trình xử lý deserializer XML-> Java. –

+0

Tuần tự hóa Java hoạt động theo cả hai cách. Nếu bạn tuần tự hóa các đối tượng Java của bạn thành XML bằng cách sử dụng tuần tự hóa Java, bạn cũng có thể deserialize chúng từ các đối tượng XML sang Java. Quá trình này minh bạch và linh hoạt.Trong một ứng dụng, tôi sử dụng XML serialization/deserialization của Java để viết cây đối tượng vào đĩa và đọc chúng trở lại theo yêu cầu của người dùng - chúng ta đang nói hàng trăm nghìn tệp - và nó hoạt động tốt theo ý kiến ​​của tôi. Xem http://java.sys-con.com/node/37550 để biết các ví dụ - các lớp chính là 'XMLEncoder' và' XMLDecoder'. – spork

0

Tôi có mối quan tâm tương tự nhưng với cấu trúc đối tượng khá phức tạp. Tôi đã giải quyết nó bằng cách sử dụng thư viện JAXB cho marshaling và de-marshaling mà là một khá phổ biến. Bạn cũng có thể xem xét hoàn toàn việc tách logic marshaling khỏi lớp java của bạn bằng cách sử dụng các khía cạnh - bạn có thể xử lý tất cả các chú thích trong một khía cạnh riêng biệt sẽ làm cho lớp java của bạn hoàn toàn sạch sẽ khỏi các chú thích marshaling.

Các vấn đề liên quan