2009-12-15 74 views
5

我正在嘗試Simple XML serializer。我對XML-> Java的反序列化更感興趣。這裏是我的代碼作爲一個單元測試:簡單的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 + "]"; 
    } 
} 

這工作,但反覆@Attribute註釋(在外地和構造函數參數)的地址類很醜陋。有沒有辦法:

  • 有簡單的數字從字段名稱的屬性名稱?
  • 有簡單的忽略序列化,以便我可以脫離註釋字段或構造函數參數嗎?
+3

如果你正在尋找簡單的XML-> Java反序列化,並且不綁定到特定的包,這裏有一個替代方法:http://sourceforge.net/projects/practicalxml/(注意,我沒有把這個作爲一個答案,因爲你似乎很低調開心,這不是一個很好的方式來對待那些試圖幫助你的人) – kdgregory 2009-12-15 22:27:16

+0

@kdgregory謝謝,我沒有綁定到一個特定的包 - 我會檢查actualxml。請不要親自採取降價措施 - 提供的建議遠遠不能解決我的問題,並且很嘈雜,國際海事組織。 – 2009-12-15 22:45:58

+1

@kdgregory第二個想法,我太低興了。向所有人道歉。 – 2009-12-16 00:18:37

回答

1

我不認爲你需要所有的重複和額外的註釋的屬性。如果名稱與對象屬性相同,則會默認使用它。

所以你可以聲明爲:

@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

不,這不起作用,至少在簡單的2.1.3中。 – 2009-12-15 22:13:31

+0

我的不好,我沒有密切關注你想擁有一個不變的地址。 基於當前的簡單,您需要重複@Attribute標記,因爲它使用註解on屬性進行序列化,並使用構造函數進行反序列化。你可以在屬性上沒有名稱標籤,但不在構造函數參數上,因爲編譯器只是通過命令而不是按名稱來跟蹤它。 – 2009-12-15 22:40:59

+0

取決於你想達到什麼目標。當然,你可以讓這個類變得可變,並且在setter中手動執行不變性。但是,再次,代碼會變得醜陋。在這兩者之間,我可能會選擇雙註釋選項。 – 2009-12-15 22:43:52

0

的Java序列化將所有的類成員的默認情況下,如果他們實施Serializable,堅持JavaBean的語法。

+0

我想你誤解了這個問題。我想要一個XML-> Java解串器。 – 2009-12-15 22:22:12

+0

Java序列化可以雙向運行。如果使用Java序列化將Java對象序列化爲XML,還可以將它們從XML到Java對象進行反序列化。這個過程是透明和靈活的。在一個應用程序中,我使用Java的XML序列化/反序列化將對象樹寫入磁盤,並根據用戶的請求讀取它們 - 我們正在談論數十萬個文件 - 在我看來,它運行良好。查看http://java.sys-con.com/node/37550的例子 - 關鍵類是'XMLEncoder'和'XMLDecoder'。 – spork 2009-12-16 13:59:17

0

我有類似的擔憂,但具有相當複雜的對象結構。 我解決了它通過使用JAXB庫進行編組和解封,這是一個很常見的問題。 您可以考慮使用方面將編組邏輯與Java類完全分離 - 您可以在單獨的方面處理所有註釋,從而使您的java類完全清除編組註釋。