XStream v1.4.10中文api手冊是幫助用戶快速上手xstream的教程,詳細介紹了xstream的使用方法,用示例講解實際應用,需要的用戶趕快來下載吧。
使用方便。提供了一個高級立麵,簡化了常見用例。
不需要映射 大多數對象可以序列化,無需指定映射。
性能。速度和低內存占用是設計的關鍵部分,使其適用於大型對象圖或具有較高消息吞吐量的係統。
清潔XML。沒有重複的信息可以通過反射獲得。這導致XML更容易為人類閱讀,比本機Java序列化更緊湊。
不需要修改對象。序列化內部字段,包括私有和最終。支持非公共和內部類。類不需要具有默認構造函數。
全對象圖支持。將保持在對象模型中遇到的重複引用。支持循環引用。
與其他XML API集成。通過實現一個接口,XStream可以直接從任何樹結構序列化(而不僅僅是XML)。
可定製的轉換策略。可以注冊策略,允許自定義特定類型如何表示為XML。
安全框架。精細控製未組合類型,以防止操縱輸入的安全問題。
錯誤消息 當由於格式不正確的XML發生異常時,將提供詳細的診斷信息,以幫助隔離和解決問題。
替代輸出格式。模塊化設計允許其他輸出格式。XStream目前擁有JSON支持和變形。
運輸
堅持
組態
單位測試
已知限製
如果使用增強模式,XStream可以重新實例化沒有默認構造函數的類。但是,如果使用不同的JVM,像舊的JRockit版本,JDK 1.4或由於SecurityManager而受到限製,則需要使用默認構造函數。
還需要增強模式來恢複任何JDK <1.5的最終字段。這意味著內部類的實例的反序列化。
注釋的自動檢測可能會導致競爭條件。預處理注釋是安全的。
一、XStream的用途
XStream是一個Java對象和XML相互轉換的工具,很好很強大。提供了所有的基礎類型、數組、集合等類型直接轉換的支持。
因此XML常用於數據交換、對象序列化(這種序列化和Java對象的序列化技術有著本質的區別)。
Stream對象相當Java對象和XML之間的轉換器,轉換過程是雙向的。創建XSteam對象的方式很簡單,隻需要new XStream()即可。
Java到xml,用toXML()方法。
Xml到Java,用fromXML()方法。
二、在沒有任何設置默認情況下,java到xml的映射,是java成員名對應xml的元素名,java類的全名對應xml根元素的名字。而實際中,往往是xml和java類都有了,要完成相互轉換,必須進行別名映射。
別名配置包含三種情況:
1、類別名,用alias(String name, Class type)。
2、類成員別名,用aliasField(String alias, Class definedIn, String fieldName)
3、類成員作為屬性別名,用 aliasAttribute(Class definedIn, String attributeName, String alias),單獨命名沒有意義,還要通過
useAttributeFor(Class definedIn, String fieldName) 應用到某個類上。
別名的配置是非常重要的,但是其中有些細節問題很重要,在例子中會專門做詳細說明。
另外還有不太常用的方法:
addImplicitCollection(Class ownerType, String fieldName),去掉集合類型生成xml的父節點。
registerConverter(Converter converter) ,注冊一個轉換器。
三、
如果這些基本的操作還不能滿足你應用的需求,XStream提供豐富的擴展點。你可以實現自己的轉換器。還可以利用XStream完成更負責的功能,比如輸出其他非xml格式的數據,還可以輸出html,還支持XML Dom類型數據,這些應用起來稍微複雜些。當然這些不是XStream應用的重點,也不用理會,真正需要的時候再查看API和源碼研究研究。
XStream的優點很多,但是也有一些小bug,比如在定義別名中的下劃線“_”轉換為xml後會變成“__”這個符號,很變態。因此,盡量避免在別名中實用任何符號,卻是需要下劃線的時候,可以考慮實用連接符“-”,這個沒有問題。
另外,我們的Java Bean中,常常有一些常量,在轉換過程,XStream也會將這些常量轉換過去,形成常量的xml節點,這顯然不是想要的結果,對於常量字段,就不做轉換了。
四、
簡單例子:
package test;
import java.util.List;
public class Person {
private String name;
private String age;
private Profile profile;
private List
addlist;
public Person(String name, String age, Profile profile,
List
addlist) {
this.name = name;
this.age = age;
this.profile = profile;
this.addlist = addlist;
}
public Person(){
}
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age='" + age + '\''
+ ", profile=" + profile + ", addlist=" + addlist + '}';
}
}
//=======================================================
package test;
public class Address {
private String add;
private String zipcode;
public Address(String add, String zipcode) {
this.add = add;
this.zipcode = zipcode;
}
public String toString() {
return "Address{" + "add='" + add + '\'' + ", zipcode='" + zipcode
+ '\'' + '}';
}
}
//======================================================
package test;
public class Profile {
private String job;
private String tel;
private String remark;
public Profile(String job, String tel, String remark) {
this.job = job;
this.tel = tel;
this.remark = remark;
}
public String toString() {
return "Profile{" + "job='" + job + '\'' + ", tel='" + tel + '\''
+ ", remark='" + remark + '\'' + '}';
}
}
//==========================================================
package test;
import java.util.ArrayList;
import java.util.List;
import com.thoughtworks.xstream.XStream;
public class XStreamTest {
public static void main(String args[]) {
test();
}
public static void test() {
System.out
.println("----------XStream學習:http://lavasoft.blog.51cto.com----------");
// 目標對象
Address address1 = new Address("鄭州市經三路", "450001");
Address address2 = new Address("西安市雁塔路", "710002");
List
addList = new ArrayList
();
addList.add(address1);
addList.add(address2);
Profile profile = new Profile("軟件工程師", "13512129933", "備注說明");
Person person = new Person("熔岩", "27", profile, addList);
// 轉換裝配
XStream xStream = new XStream();
output(0, xStream, person);
/************** 設置類別名 ****************/
xStream.alias("PERSON", test.Person.class);
xStream.alias("PROFILE", test.Profile.class);
xStream.alias("ADDRESS", test.Address.class);
output(1, xStream, person);
/************* 設置類成員的別名 ***************/
// 設置Person類的name成員別名Name
xStream.aliasField("Name", Person.class, "name");
/*
* [注意] 設置Person類的profile成員別名PROFILE,這個別名和Profile類的別名一致,
* 這樣可以保持XStream對象可以從profile成員生成的xml片段直接轉換為Profile成員,
* 如果成員profile的別名和Profile的別名不一致,則profile成員生成的xml片段不可
* 直接轉換為Profile對象,需要重新創建XStream對象,這豈不給自己找麻煩?
*/
xStream.aliasField("PROFILE", test.Person.class, "profile");
xStream.aliasField("ADDLIST", test.Person.class, "addlist");
xStream.aliasField("Add", test.Address.class, "add");
xStream.aliasField("Job", test.Profile.class, "job");
output(2, xStream, person);
/******* 設置類成員為xml一個元素上的屬性 *******/
xStream.useAttributeFor(Address.class, "zipcode");
output(3, xStream, person);
/************* 設置屬性的別名 ***************/
xStream.aliasAttribute(Address.class, "zipcode", "Zipcode");
output(4, xStream, person);
/************* 將xml轉為java對象 ******× ****/
String person_xml = "\n" + " 熔岩\n"
+ " 27\n" + " \n"
+ " 軟件工程師\n" + " 13512129933\n"
+ " 備注說明\n" + " \n"
+ " \n" + "
\n"
+ " 鄭州市經三路\n" + "
\n"
+ "
\n"
+ " 西安市雁塔路\n" + "
\n"
+ " \n" + "";
String profile_xml = " \n" + " 軟件工程師\n"
+ " 13512129933\n"
+ " 備注說明\n" + " ";
String address_xml = "
\n"
+ " 西安市雁塔路\n" + "
";
// 同樣實用上麵的XStream對象xStream
System.out.println(xStream.fromXML(person_xml).toString());
System.out.println(xStream.fromXML(profile_xml).toString());
System.out.println(xStream.fromXML(address_xml).toString());
}
public static void output(int i, XStream xStream, Object obj) {
String xml = xStream.toXML(obj);
System.out.println(">>>第[ " + i + "]次輸出\n");
System.out.println(xml + "\n");
}
}
140.5M / 09-05
76.4M / 03-25
55M / 06-05
237.9M / 04-13
900.9M / 03-02
96.2M / 07-06
311.2M / 07-06
335M / 07-06
200M / 07-06
413.8M / 07-06
484.7M / 09-27
165.4M / 09-05
353.9M / 06-05
131.8M / 04-13
195.6M / 03-03
45.6M / 09-08
665.2M / 07-06
2.84G / 07-06
93M / 07-06
338.3M / 07-06
1.38G / 07-26
488.3M / 07-16
109.8M / 06-03
142M / 01-08
1.2M / 11-23
548.8M / 04-13
1.6M / 04-13
1.48G / 03-18
646.6M / 03-03
133.7M / 03-03
110.5M / 09-05
33.4M / 09-05
325.8M / 08-12
60M / 04-29
254M / 04-25
659M / 04-23
1M / 12-26
253.4M / 12-08
253M / 12-08
1.19G / 11-16
369M / 09-22
181.5M / 09-22
201.2M / 09-05
488.3M / 07-16
248.9M / 12-08
248.9M / 12-08
100.6M / 03-06
148.9M / 03-06
1.12G / 07-06
1.25G / 07-06
1.76G / 09-22
1.92G / 04-17
116.2M / 04-10
201.5M / 04-13
7.31G / 07-01
94.3M / 07-06
2.48G / 07-06
7.63G / 07-06
1M / 07-06
778.1M / 07-06
561.8M / 07-11
72M / 07-06
548.7M / 07-06
1.00G / 07-06
9.13G / 07-06
126.2M / 07-06
72M / 07-06
105.1M / 07-06
132M / 07-06
132M / 07-06