xstream不映射字段_这本XStream学习手册,真的不来看看?
一、前言
1、XStream官網(wǎng)
http://x-stream.github.io
2、XStream是什么
XStream是一個簡單的基于Java的類庫,用來將Java對象序列化成XML(JSON)或反序列化為對象(即:可以輕易的將Java對象和XML文檔相互轉(zhuǎn)換)
3、XSteam能干什么
XStream在運行時使用Java反射機制對要進行序列化的對象樹的結(jié)構(gòu)進行探索,并不需要對對象作出修改。XStream可以序列化內(nèi)部字段,包括私private和final字段,并且支持非公開類以及內(nèi)部類。
在缺省情況下,XStream不需要配置映射關(guān)系,對象和字段將映射為同名XML元素。但是當(dāng)對象和字段名與XML中的元素名不同時,XStream支持指定別名。XStream支持以方法調(diào)用的方式,或是Java 標(biāo)注的方式指定別名。
XStream在進行數(shù)據(jù)類型轉(zhuǎn)換時,使用系統(tǒng)缺省的類型轉(zhuǎn)換器。同時,也支持用戶自定義的類型轉(zhuǎn)換器。
4、XStream特點**使用方便 **- XStream的API提供了一個高層次外觀,以簡化常用的用例
**無需創(chuàng)建映射 **- XStream的API提供了默認(rèn)的映射大部分對象序列化
性能 - XStream快速和低內(nèi)存占用,適合于大對象圖或系統(tǒng)
干凈的XML - XStream創(chuàng)建一個干凈和緊湊XML結(jié)果,這很容易閱讀
不需要修改對象 - XStream可序列化的內(nèi)部字段,如private和final字段,支持非公開類和內(nèi)部類。默認(rèn)構(gòu)造函數(shù)不是強制性的要求
完整對象圖支持 - XStream允許保持在對象模型中遇到的重復(fù)引用,并支持循環(huán)引用
可自定義的轉(zhuǎn)換策略 - 定制策略可以允許特定類型的定制被表示為XML的注冊
安全框架 - XStream提供了一個公平控制有關(guān)解組的類型,以防止操縱輸入安全問題
**錯誤消息 **- 出現(xiàn)異常是由于格式不正確的XML時,XStream拋出一個統(tǒng)一的例外,提供了詳細(xì)的診斷,以解決這個問題
另一種輸出格式 - XStream支持其它的輸出格式,如JSON
5、XStream常見的用途
傳輸、持久化、配置、單元測試這里是我的個人專欄《Java 進階集中營》,里面收錄有很多優(yōu)秀的java技術(shù)內(nèi)容和工作分享,大家可以關(guān)注下,有優(yōu)秀的技術(shù)內(nèi)容也歡迎大家分享到我的專欄。JAVA 進階集中營?zhuanlan.zhihu.com
二、XStream入門
1、添加XSteam依賴
com.thoughtworks.xstream
xstream
1.4.12
org.codehaus.jettison
jettison
1.4.1
2、XStream基本使用
package io.github.xstream.test01;
?
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
import lombok.AllArgsConstructor;
import lombok.ToString;
?
public class XStreamTest01 {
public static void main(String[] args) {
Student student = new Student("張三", 20);
XStream xStream = new XStream();//需要XPP3庫
//XStream xStream = new XStream(new DomDriver());//不需要XPP3庫
//XStream xStream = new XStream(new StaxDriver());//不需要XPP3庫開始使用Java 6
//XML序列化
String xml = xStream.toXML(student);
System.out.println(xml);
//XML反序列化
student = (Student) xStream.fromXML(xml);
System.out.println(student);
?
xStream = new XStream(new JettisonMappedXmlDriver());
xStream.setMode(XStream.NO_REFERENCES);
//Json序列化
String json = xStream.toXML(student);
System.out.println(json);
//Json反序列
student = (Student) xStream.fromXML(json);
System.out.println(student);
}
}
?
@AllArgsConstructor
@ToString
class Student {
private String name;
private int age;
}
3、程序運行結(jié)果
張三
20
Security framework of XStream not initialized, XStream is probably vulnerable.
Student(name=張三, age=20)
{"io.github.xstream.test01.Student":{"name":"張三","age":20}}
Student(name=張三, age=20)
Security framework of XStream not initialized, XStream is probably vulnerable.
注意:文中使用到的Lombok注解,Lombok依賴自行添加;XStream序列化XML時需要引用的jar包:xstream-[version].jar、xpp3-[version].jar、xmlpull-[version].jar,當(dāng)引入xstream依賴后會自動依賴xpp3、xmlpull依賴。XStream序列化JSON需要引用的jar包:jettison-[version].jar。
使用XStream序列化時,對JavaBean沒有任何限制。JavaBean的字段可以是私有的,也可以沒有g(shù)etter或setter方法,還可以沒有默認(rèn)的構(gòu)造函數(shù)。
XStream序列化XML時可以允許用戶使用不同的XML解析器,用戶可以使用一個標(biāo)準(zhǔn)的JAXP DOM解析器或自Java 6集成STAX解析器。這樣用戶就不需要依賴xpp3-[version].jar。
三、XStream混疊****
1、混疊是一種技術(shù)來定制生成XML或者使用XStream特定的格式化XML。假設(shè),一個下面的XML格式是用于序列化/反序列化Student對象。
小米
小米手機的描述
蘋果
蘋果手機的描述
2、根椐上面的XML格式,我們創(chuàng)建實體類
@AllArgsConstructor
@ToString
class Student {
private String studentName;
private List phones;
}
?
@AllArgsConstructor
@ToString
class Phone {
private String brand;
private String description;
}
3、執(zhí)行代碼
package io.github.xstream.test02;
?
import com.thoughtworks.xstream.XStream;
import lombok.AllArgsConstructor;
import lombok.ToString;
?
import java.util.ArrayList;
import java.util.List;
?
public class XStreamTest02 {
public static void main(String[] args) {
List phones = new ArrayList<>();
phones.add(new Phone("小米手機", "小米手機的描述"));
phones.add(new Phone("蘋果手機", "蘋果手機的描述"));
Student student = new Student("張三", phones);
?
XStream xStream = new XStream();//需要XPP3庫
//XML序列化
String xml = xStream.toXML(student);
System.out.println(xml);
}
}
?
@AllArgsConstructor
@ToString
class Student {
private String studentName;
private List phones;
}
?
@AllArgsConstructor
@ToString
class Phone {
private String brand;
private String description;
}
4、驗證輸出
張三
小米手機
小米手機的描述
蘋果手機
蘋果手機的描述
在上面的結(jié)果,我們已經(jīng)看到了Student對象名稱是完全合格的。要替換它作為學(xué)生的標(biāo)簽,按照**四、XStream類混疊**的步驟
另外,在上述結(jié)果中可以看出,所需studentName要重命名來命名。要替換它,按照**五、XStream字段混疊**的步驟
在上面的結(jié)果,我們可以看到手機標(biāo)記被添加成為手機列表。替換它,按照**六、XStream隱式集合混疊**的步驟
在上面的結(jié)果,我們可以看到這個名字來作為一個子節(jié)點,需要將它作為根節(jié)點的屬性。替換它,按照**七、XStream屬性混疊**的步驟
四、****XStream****類混疊
1、類混疊是用來創(chuàng)建一個類的XML完全限定名稱的別名。讓我們修改XStreamTest02例子,將下面的代碼添加到XStreamTest02例子里面
xStream.alias("student", Person02.class);
xStream.alias("phone", Phone.class);
2、執(zhí)行代碼
package io.github.xstream.test02;
?
import com.thoughtworks.xstream.XStream;
import lombok.AllArgsConstructor;
import lombok.ToString;
?
import java.util.ArrayList;
import java.util.List;
?
public class XStreamTest02 {
public static void main(String[] args) {
List phones = new ArrayList<>();
phones.add(new Phone("小米手機", "小米手機的描述"));
phones.add(new Phone("蘋果手機", "蘋果手機的描述"));
Student student = new Student("張三", phones);
?
XStream xStream = new XStream();//需要XPP3庫
xStream.alias("student", Student.class);
xStream.alias("phone", Phone.class);
?
//XML序列化
String xml = xStream.toXML(student);
System.out.println(xml);
}
}
?
@AllArgsConstructor
@ToString
class Student {
private String studentName;
private List phones;
}
?
@AllArgsConstructor
@ToString
class Phone {
private String brand;
private String description;
}
3、執(zhí)行結(jié)果
張三
小米手機
小米手機的描述
蘋果手機
蘋果手機的描述
可以看到和分別被修改為了和
五、****XStream****字段混疊
1、字段混疊用于創(chuàng)建以XML字段的別名。讓我們再次修改原來的XStreamTest02例子,將下面的代碼添加到XStreamTest02例子里面
xStream.aliasField("name", Student.class, "studentName");
2、執(zhí)行代碼
package io.github.xstream.test02;
?
import com.thoughtworks.xstream.XStream;
import lombok.AllArgsConstructor;
import lombok.ToString;
?
import java.util.ArrayList;
import java.util.List;
?
public class XStreamTest02 {
public static void main(String[] args) {
List phones = new ArrayList<>();
phones.add(new Phone("小米手機", "小米手機的描述"));
phones.add(new Phone("蘋果手機", "蘋果手機的描述"));
Student student = new Student("張三", phones);
?
XStream xStream = new XStream();//需要XPP3庫
xStream.alias("student", Student.class);
xStream.alias("phone", Phone.class);
xStream.aliasField("name", Student.class, "studentName");
?
//XML序列化
String xml = xStream.toXML(student);
System.out.println(xml);
}
}
?
@AllArgsConstructor
@ToString
class Student {
private String studentName;
private List phones;
}
?
@AllArgsConstructor
@ToString
class Phone {
private String brand;
private String description;
}
3、執(zhí)行結(jié)果
張三
小米手機
小米手機的描述
蘋果手機
蘋果手機的描述
可以看到被修改為了
六、****XStream****隱式集合混疊
1、隱式集合混疊時使用的集合是表示在XML無需顯示根。例如,在我們的例子中,我們需要一個接一個,但不是在根節(jié)點來顯示每一個節(jié)點。讓我們再次修改原來的XStreamTest02例子,將下面的代碼添加到XStreamTest02例子里面
xStream.addImplicitCollection(Student.class, "phones");
2、執(zhí)行代碼
package io.github.xstream.test02;
?
import com.thoughtworks.xstream.XStream;
import lombok.AllArgsConstructor;
import lombok.ToString;
?
import java.util.ArrayList;
import java.util.List;
?
public class XStreamTest02 {
public static void main(String[] args) {
List phones = new ArrayList<>();
phones.add(new Phone("小米手機", "小米手機的描述"));
phones.add(new Phone("蘋果手機", "蘋果手機的描述"));
Student student = new Student("張三", phones);
?
XStream xStream = new XStream();//需要XPP3庫
xStream.alias("student", Student.class);
xStream.alias("phone", Phone.class);
xStream.aliasField("name", Student.class, "studentName");
xStream.addImplicitCollection(Student.class, "phones");
?
//XML序列化
String xml = xStream.toXML(student);
System.out.println(xml);
}
}
?
@AllArgsConstructor
@ToString
class Student {
private String studentName;
private List phones;
}
?
@AllArgsConstructor
@ToString
class Phone {
private String brand;
private String description;
}
3、執(zhí)行結(jié)果
張三
小米手機
小米手機的描述
蘋果手機
蘋果手機的描述
可以看到被隱藏了
七、****XStream****屬性混疊
1、屬性混疊用于創(chuàng)建一個成員變量作為XML屬性序列化。讓我們再次修改原來的XStreamTest02例子,將下面的代碼添加到XStreamTest02例子里面
xStream.useAttributeFor(Student.class, "studentName");
2、執(zhí)行代碼
package io.github.xstream.test02;
?
import com.thoughtworks.xstream.XStream;
import lombok.AllArgsConstructor;
import lombok.ToString;
?
import java.util.ArrayList;
import java.util.List;
?
public class XStreamTest02 {
public static void main(String[] args) {
List phones = new ArrayList<>();
phones.add(new Phone("小米手機", "小米手機的描述"));
phones.add(new Phone("蘋果手機", "蘋果手機的描述"));
Student student = new Student("張三", phones);
?
XStream xStream = new XStream();//需要XPP3庫
xStream.alias("student", Student.class);
xStream.alias("phone", Phone.class);
xStream.aliasField("name", Student.class, "studentName");
xStream.addImplicitCollection(Student.class, "phones");
xStream.useAttributeFor(Student.class, "studentName");
?
//XML序列化
String xml = xStream.toXML(student);
System.out.println(xml);
}
}
?
@AllArgsConstructor
@ToString
class Student {
private String studentName;
private List phones;
}
?
@AllArgsConstructor
@ToString
class Phone {
private String brand;
private String description;
}
3、執(zhí)行結(jié)果
小米手機
小米手機的描述
蘋果手機
蘋果手機的描述
可以看到被作為了的屬性
八、****XStream****包混疊
1、包混疊用于創(chuàng)建一個類XML的完全限定名稱的別名到一個新的限定名稱。讓我們再次修改原來的XStreamTest02例子,將下面代碼
xStream.alias("student", Student.class);
xStream.alias("phone", Phone.class);
修改為
xStream.aliasPackage("xx.xx.xx.xx", "io.github.xstream.test02");
2、執(zhí)行代碼
package io.github.xstream.test02;
?
import com.thoughtworks.xstream.XStream;
import lombok.AllArgsConstructor;
import lombok.ToString;
?
import java.util.ArrayList;
import java.util.List;
?
public class XStreamTest02 {
public static void main(String[] args) {
List phones = new ArrayList<>();
phones.add(new Phone("小米手機", "小米手機的描述"));
phones.add(new Phone("蘋果手機", "蘋果手機的描述"));
Student student = new Student("張三", phones);
?
XStream xStream = new XStream();//需要XPP3庫
// xStream.alias("student", Student.class);
// xStream.alias("phone", Phone.class);
xStream.aliasPackage("xx.xx.xx.xx", "io.github.xstream.test02");
xStream.aliasField("name", Student.class, "studentName");
xStream.addImplicitCollection(Student.class, "phones");
xStream.useAttributeFor(Student.class, "studentName");
?
//XML序列化
String xml = xStream.toXML(student);
System.out.println(xml);
}
}
?
@AllArgsConstructor
@ToString
class Student {
private String studentName;
private List phones;
}
?
@AllArgsConstructor
@ToString
class Phone {
private String brand;
private String description;
}
3、執(zhí)行結(jié)果
小米手機
小米手機的描述
蘋果手機
蘋果手機的描述
可以看到包名由io.github.xstream.test02替換為了xx.xx.xx.xx
九、****XStream****注解
1、前面的四、五、六、七、八步驟都是通過代碼操作的
//xStream.alias("student", Student.class);
//xStream.alias("phone", Phone.class);
xStream.aliasPackage("xx.xx.xx.xx", "io.github.xstream.test02");
xStream.aliasField("name", Student.class, "studentName");
xStream.addImplicitCollection(Student.class, "phones");
xStream.useAttributeFor(Student.class, "studentName");
2、XStream同時也支持注解,使用注解會變得簡單也會達到相同的效果
package io.github.xstream.test03;
?
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.*;
import com.thoughtworks.xstream.converters.basic.BooleanConverter;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
?
import java.util.ArrayList;
import java.util.List;
?
public class XStreamTest03 {
public static void main(String[] args) {
List phones = new ArrayList<>();
phones.add(new Phone("小米手機", "小米手機的描述"));
phones.add(new Phone("蘋果手機", "蘋果手機的描述"));
Student student = new Student("張三", phones, 20, true);
XStream xStream = new XStream();//需要XPP3庫
//xStream.processAnnotations(new Class[]{Student.class});
xStream.autodetectAnnotations(true);
//XML序列化
String xml = xStream.toXML(student);
System.out.println(xml);
}
}
?
@AllArgsConstructor
@ToString
//別名注解
@XStreamAlias("student")
class Student {
@XStreamAlias("name")
//把字段節(jié)點設(shè)置成屬性
@XStreamAsAttribute
private String studentName;
//省略集合根節(jié)點
@XStreamImplicit
private List phones;
//隱藏字段
@XStreamOmitField
private int age;
//設(shè)置轉(zhuǎn)換器
@XStreamConverter(value = BooleanConverter.class, booleans = {false}, strings = {"男", "女"})
private boolean sex;
}
?
@AllArgsConstructor
@ToString
@XStreamAlias("phone")
class Phone {
private String brand;
private String description;
}
3、使用注解的話,需要XML序列化之前添加如下代碼
xStream.autodetectAnnotations(true);
或者
xStream.processAnnotations(new Class[]{Student.class});
4、執(zhí)行結(jié)果
小米手機
小米手機的描述
蘋果手機
蘋果手機的描述
男
使用注解我們也可以看到也能達到相同的效果
注意:當(dāng)使用XStream對象處理一個被注解的類型時,XStream對象也會處理所有與其相關(guān)的類型的注解信息,即該類型的父類、父接口、所有子類的注解。
十、****XStream自定義****轉(zhuǎn)換器
1、XStream自帶的轉(zhuǎn)換器
XStream內(nèi)部有許多轉(zhuǎn)換器,用于JavaBean對象到XML或JSON之間的轉(zhuǎn)換。這些轉(zhuǎn)換器的詳細(xì)信息網(wǎng)址:http://x-stream.github.io/converters.html
2、使用自定義轉(zhuǎn)換器
package io.github.xstream.test04;
?
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
?
public class XStreamTest04 {
public static void main(String[] args) {
Student student =new Student("張三",19);
XStream xStream = new XStream();
//注冊轉(zhuǎn)換器
xStream.registerConverter(new StudentConverter());
//序列化
String xml = xStream.toXML(student);
System.out.println(xml);
//反序列化
student=(Student)xStream.fromXML(xml);
System.out.println(student);
}
}
?
@Getter
@Setter
@ToString
@AllArgsConstructor
class Student {
private String name;
private int age;
}
自定義轉(zhuǎn)換器
package io.github.xstream.test04;
?
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
?
public class StudentConverter implements Converter {
//定義轉(zhuǎn)換器能轉(zhuǎn)換的JavaBean類型
@Override
public boolean canConvert(Class type) {
return type.equals(Student.class);
}
?
//把對象序列化成XML或JSON
@Override
public void marshal(Object value, HierarchicalStreamWriter writer,
MarshallingContext context) {
Student student = (Student) value;
writer.startNode("姓名");
writer.setValue(student.getName());
writer.endNode();
writer.startNode("年齡");
writer.setValue(student.getAge() + "");
writer.endNode();
writer.startNode("轉(zhuǎn)換器");
writer.setValue("自定義的轉(zhuǎn)換器");
writer.endNode();
}
?
//把XML或JSON反序列化成對象
@Override
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
Student student = new Student("", -1);
reader.moveDown();
student.setName(reader.getValue());
reader.moveUp();
reader.moveDown();
student.setAge(Integer.parseInt(reader.getValue()));
reader.moveUp();
return student;
}
}
3、執(zhí)行結(jié)果
張三姓名>
19年齡>
自定義的轉(zhuǎn)換器轉(zhuǎn)換器>
Security framework of XStream not initialized, XStream is probably vulnerable.
Student(name=張三, age=19)
4、常用的轉(zhuǎn)換器接口與抽象類
SingleValueConverter:單值轉(zhuǎn)換接口
AbstractSingleValueConverter:單值轉(zhuǎn)換抽象類
Converter:常規(guī)轉(zhuǎn)換器接口
十一、****XStream****對象流
1、對象輸出流
package io.github.xstream.test05;
?
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import lombok.AllArgsConstructor;
import lombok.ToString;
?
import java.io.*;
?
public class XStreamTest05 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
XStreamTest05 xStreamTest04 = new XStreamTest05();
String path = "F:\\test.txt";
XStream xStream = new XStream();//需要XPP3庫
xStream.processAnnotations(Student.class);
xStream.autodetectAnnotations(true);
xStreamTest04.writeObject(xStream, path);
}
?
//對象輸出流方法
public void writeObject(XStream xStream, String path) throws IOException {
Student zs = new Student("張三", 20);
Student ls = new Student("李四", 21);
Student ww = new Student("王五", 22);
ObjectOutputStream objectOutputStream = xStream.createObjectOutputStream(new FileOutputStream(path));
objectOutputStream.writeObject(zs);
objectOutputStream.writeObject(ls);
objectOutputStream.writeObject(ww);
objectOutputStream.writeObject("totalStudent");
objectOutputStream.writeInt(3);
objectOutputStream.close();
}
}
?
@AllArgsConstructor
@ToString
//別名注解
@XStreamAlias("student")
class Student {
@XStreamAlias("name")
//把字段節(jié)點設(shè)置成屬性
@XStreamAsAttribute
private String studentName;
private int age;
}
2、在指定路徑中打開test.txt文件,查看執(zhí)行結(jié)果
20
21
22
totalStudent
3
注意:XStream對象流是通過標(biāo)準(zhǔn)java.io.ObjectOutputStream和java.io.ObjectInputStream對象。因為XML文檔只能有一個根節(jié)點,必須包裝在一個序列化的所有元素額外的根節(jié)點。這個根節(jié)點默認(rèn)為上面的例子所示。
3、對象輸入流
package io.github.xstream.test05;
?
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import lombok.AllArgsConstructor;
import lombok.ToString;
?
import java.io.*;
?
public class XStreamTest05 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
XStreamTest05 xStreamTest04 = new XStreamTest05();
String path = "F:\\test.txt";
XStream xStream = new XStream();//需要XPP3庫
xStream.processAnnotations(Student.class);
xStream.autodetectAnnotations(true);
xStreamTest04.readObject(xStream, path);
}
?
//對象輸入流方法
public void readObject(XStream xStream, String path) throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream = xStream.createObjectInputStream(new FileInputStream(path));
System.out.println((Student) objectInputStream.readObject());
System.out.println((Student) objectInputStream.readObject());
System.out.println((Student) objectInputStream.readObject());
System.out.println(objectInputStream.readObject());
System.out.println(objectInputStream.readInt());
}
}
?
@AllArgsConstructor
@ToString
//別名注解
@XStreamAlias("student")
class Student {
@XStreamAlias("name")
//把字段節(jié)點設(shè)置成屬性
@XStreamAsAttribute
private String studentName;
private int age;
}
4、執(zhí)行結(jié)果
Student(studentName=張三, age=20)
Student(studentName=李四, age=21)
Student(studentName=王五, age=22)
totalStudent
3
**十二、****XStream持久化API******
1、保存Java對象
?package io.github.xstream.test06;
?
import com.thoughtworks.xstream.persistence.FilePersistenceStrategy;
import com.thoughtworks.xstream.persistence.PersistenceStrategy;
import com.thoughtworks.xstream.persistence.XmlArrayList;
import lombok.AllArgsConstructor;
import lombok.ToString;
?
import java.io.File;
import java.util.List;
?
public class XStreamTest06 {
public static void main(String[] args) {
XStreamTest06 xStreamTest06=new XStreamTest06();
xStreamTest06.saveObject();
}
?
//保存Java對象
public void saveObject(){
PersistenceStrategy strategy = new FilePersistenceStrategy(new File("F:\\"));
List list = new XmlArrayList(strategy);
list.add(new Student("張三",13));
list.add(new Student("李四",21));
list.add(new Student("王五",17));
}
}
?
@ToString
@AllArgsConstructor
class Student {
private String name;
private int age;
}
2、運行程序結(jié)果,在F磁盤的根路徑可以看到有三個文件:int@0.xml、int@1.xml、int@2.xml,每個對象都被序列化到XML文件里
3、讀取并刪除JavaBean對象
package io.github.xstream.test06;
?
import com.thoughtworks.xstream.persistence.FilePersistenceStrategy;
import com.thoughtworks.xstream.persistence.PersistenceStrategy;
import com.thoughtworks.xstream.persistence.XmlArrayList;
import lombok.AllArgsConstructor;
import lombok.ToString;
?
import java.io.File;
import java.util.Iterator;
import java.util.List;
?
public class XStreamTest06 {
public static void main(String[] args) {
XStreamTest06 xStreamTest06 = new XStreamTest06();
xStreamTest06.deleteObject();
}
//讀取并刪除Java對象
public void deleteObject() {
PersistenceStrategy strategy = new FilePersistenceStrategy(new File("F:\\"));
List list = new XmlArrayList(strategy);
for (Iterator it = list.iterator(); it.hasNext(); ) {
System.out.println((Student) it.next());
//刪除對象序列化文件
it.remove();
}
}
}
?
@ToString
@AllArgsConstructor
class Student {
private String name;
private int age;
}
4、運行程序結(jié)果,可以看到把F磁盤的根路徑int@0.xml、int@1.xml、int@2.xml文件刪除了
Security framework of XStream not initialized, XStream is probably vulnerable.
Student(name=張三, age=13)
Student(name=李四, age=21)
Student(name=王五, age=17)
十三、****XStream****操作JSON
1、XStream序列化JSON的重命名
package io.github.xstream.test07;
?
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
import io.github.xstream.test04.StudentConverter;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
?
public class XStreamTest07 {
public static void main(String[] args) {
XStreamTest07 xStreamTest07 = new XStreamTest07();
xStreamTest07.serializeJson();
}
?
public void serializeJson() {
Student student = new Student("張三", 19);
XStream xStream = new XStream(new JettisonMappedXmlDriver());//設(shè)置Json解析器
xStream.autodetectAnnotations(true);
//JSON序列化
String xml = xStream.toXML(student);
System.out.println(xml);
//JSON反序列化
student = (Student) xStream.fromXML(xml);
System.out.println(student);
}
}
?
@ToString
@AllArgsConstructor
@XStreamAlias("人")
class Student {
@XStreamAlias("姓名")
private String name;
@XStreamAlias("年齡")
private int age;
}
2、運行結(jié)果
{"人":{"姓名":"張三","年齡":19}}
Student(name=張三, age=19)
Security framework of XStream not initialized, XStream is probably vulnerable.
注意:XStream序列化JSON的重命名的方式與其序列化成XML的方式一樣!
3、去掉序列化JSON的根節(jié)點
?package io.github.xstream.test07;
?
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
import com.thoughtworks.xstream.io.json.JsonWriter;
import io.github.xstream.test04.StudentConverter;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
?
import java.io.Writer;
?
public class XStreamTest07 {
public static void main(String[] args) {
XStreamTest07 xStreamTest07 = new XStreamTest07();
xStreamTest07.removeRootNode();
}
?
public void removeRootNode() {
Student student = new Student("張三", 19);
XStream xStream = new XStream(new JsonHierarchicalStreamDriver() {
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
}
});
//Json序列化
String xml = xStream.toXML(student);
System.out.println(xml);
}
}
?
@ToString
@AllArgsConstructor
@XStreamAlias("人")
class Student {
@XStreamAlias("姓名")
private String name;
@XStreamAlias("年齡")
private int age;
}
4、運行結(jié)果
{
"name": "張三",
"age": 19
}
注意:去掉根節(jié)點后的JSON串是不能反序列化的,因為XStream不知道它的類型。
5、JSON的解析器區(qū)別
前面兩個例子使用了不同的JSON解析器,這里說明他們的不同之處:JettisonMappedXmlDriver:是支持序列化和反序列化Json的。
JsonHierarchicalStreamDriver:只支持序列化,不支持反序列化。
總結(jié)
以上是生活随笔為你收集整理的xstream不映射字段_这本XStream学习手册,真的不来看看?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果4代手表功能是什么(苹果官网报价)
- 下一篇: mysql数据库怎么给表增加一个字段?(