引言:
序列化是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程鬓照,在序列化期間,對象將其帶你過去的狀態(tài)寫入到臨時或持儲存區(qū)减江,反序列化就是重新創(chuàng)建對象的過程提岔,此對象來自于臨時或持久儲存區(qū)拆座。
序列化的作用:
就好比如存儲數(shù)據(jù)到數(shù)據(jù)庫主巍,將一些數(shù)據(jù)持久化到數(shù)據(jù)庫中,而有時候需要將對象持久化挪凑,雖然說將對象狀態(tài)持久化的方式有很多孕索,但是java給我們提供了一種很便捷的方式,那就是序列化躏碳,序列化可以實現(xiàn)對象到文件之間的直接轉(zhuǎn)換搞旭,實現(xiàn)細(xì)節(jié)對我們隱藏。
具體的三種用途:
將對象的狀態(tài)信息持久化保存到硬盤上
將對象信息在網(wǎng)絡(luò)上傳輸
深度克鹿矫唷(就是序列化后再反序列化)
方式一:實現(xiàn)Serializable接口肄渗,通過序列化流
實現(xiàn)Serializable接口,通過ObjectOutputStream和ObjectInputStream將對象序列化和反序列化咬最。
importjava.io.*;publicclassUserimplements Serializable {
? ? privatestaticfinallongserialVersionUID = 1L;
? ? private String name;
? ? privateint age;
? ? publicUser(String name,int age) {
? ? ? ? this.name = name;
? ? ? ? this.age = age;
? ? }
? ? @Override
? ? public String toString() {
? ? ? ? return"User{" +? ? ? ? ? ? ? ? "name='" + name + '\'' +? ? ? ? ? ? ? ? ", age=" + age +? ? ? ? ? ? ? ? '}';
? ? }
? ? publicstaticvoidmain(String[] args)throws IOException, ClassNotFoundException {//? ? ? ? User user = new User("gol",22);//? ? ? ? ByteArrayOutputStream bo = new ByteArrayOutputStream();//? ? ? ? ObjectOutputStream oo = new ObjectOutputStream(bo);//? ? ? ? oo.writeObject(user);//序列化.user寫入字節(jié)數(shù)組流中//? ? ? ? ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());//? ? ? ? ObjectInputStream oi = new ObjectInputStream(bi);//? ? ? ? User userSer = (User) oi.readObject();//反序列化//? ? ? ? System.out.println(userSer);User user =newUser("gol",22);
? ? ? ? FileOutputStream fos =newFileOutputStream("a.txt");
? ? ? ? ObjectOutputStream oo =new ObjectOutputStream(fos);
? ? ? ? oo.writeObject(user);//序列化.user寫入文件中FileInputStream fis =newFileInputStream("a.txt");
? ? ? ? ObjectInputStream oi =new ObjectInputStream(fis);
? ? ? ? User userSer = (User) oi.readObject();//反序列化? ? ? ? System.out.println(userSer);
? ? ? ? oi.close();
? ? ? ? fis.close();
? ? ? ? oo.close();
? ? ? ? fos.close();
? ? }
}
方式二:實現(xiàn)Externalizable接口翎嫡,重寫writeExternal和readExternal方法
Externalizable接口繼承了Serializable接口,替我們封裝了兩個方法永乌,一個用于序列化惑申,一個用于反序列化。這種方式是將屬性序列化翅雏,注意這種方式transient修飾詞將失去作用圈驼,也就是說被transient修飾的屬性,只要你在writeExternal方法中序列化了該屬性望几,照樣也會得到序列化绩脆。
importjava.io.*;publicclassUserimplements Externalizable {
? ? privatestaticfinallongserialVersionUID = 1L;
? ? private? String name;
? ? privateint age;
? ? public User() {
? ? }
? ? publicUser(String name,int age) {
? ? ? ? this.name = name;
? ? ? ? this.age = age;
? ? }
? ? @Override
? ? public String toString() {
? ? ? ? return"User{" +? ? ? ? ? ? ? ? "name='" + name + '\'' +? ? ? ? ? ? ? ? ", age=" + age +? ? ? ? ? ? ? ? '}';
? ? }
? ? @Override
? ? publicvoidwriteExternal(ObjectOutput out)throws IOException {
? ? ? ? out.writeObject(this.name);//將屬性分別序列化out.writeObject(this.age);
? ? }
? ? @Override
? ? publicvoidreadExternal(ObjectInput in)throws IOException, ClassNotFoundException {
? ? ? ? this.name=(String)in.readObject();//反序列化屬性this.age=(int)in.readObject();
? ? }
? ? publicstaticvoidmain(String[] args)throws IOException, ClassNotFoundException {
? ? ? ? FileOutputStream fos =newFileOutputStream("a.txt");
? ? ? ? ObjectOutputStream oo =new ObjectOutputStream(fos);
? ? ? ? FileInputStream fis =newFileInputStream("a.txt");
? ? ? ? ObjectInputStream oi =new ObjectInputStream(fis);
? ? ? ? User user =newUser("gol",19);
? ? ? ? user.writeExternal(oo);//序列化User userEnr =new User();
? ? ? ? userEnr.readExternal(oi);//反序列化? ? ? ? System.out.println(userEnr);
? ? ? ? oi.close();
? ? ? ? fis.close();
? ? ? ? oo.close();
? ? ? ? fos.close();
? ? }
}
總結(jié):
注意以下三點:
Serializable接口是標(biāo)記接口,是個空接口橄抹,用于標(biāo)識該類可以被序列化靴迫。
transient是屬性修飾符,被其修飾的屬性將不會被序列化楼誓,但是使用方式二的話矢劲,明確寫明該屬性序列化同樣可以得到序列化。
serialVersionUID屬性是類的序列化標(biāo)識ID慌随,若序列化的對象和反序列化的對象其serialVersionUID屬性不一樣則會報錯。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 歡迎工作一到五年的Java工程師朋友們加入Java群:?891219277?
群內(nèi)提供免費的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)阁猜、高性能及分布式丸逸、Jvm性能調(diào)優(yōu)、Spring源碼剃袍,MyBatis黄刚,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰民效!趁年輕憔维,使勁拼,給未來的自己一個交代畏邢!