Java文件操作之序列化與對象處理流詳解
1.序列化與反序列化
序列化就是在保存數(shù)據(jù)時,保存數(shù)據(jù)的值和數(shù)據(jù)類型;
反序列化就是在恢復(fù)數(shù)據(jù)時,恢復(fù)數(shù)據(jù)的值和數(shù)據(jù)類型;
需要讓某個對象支持序列化機(jī)制,則必須讓其類是可序列化的;
為了讓某個類是可序列化的,該類必須實現(xiàn) Serilizable與 Externalizable 兩個接口之一。
為什么需要對象處理流?
答:假設(shè)我們存儲了 int num = 20這個數(shù)據(jù)到文件中,而這個20是一個數(shù)字,我們需要從文件中將數(shù)據(jù)恢復(fù)。
可是,文件中僅僅存儲了 20 這一個數(shù)字,我們沒有辦法判斷,存儲它的時候是將它存儲為了 int 類型還是 String 類型。
而對象處理流,就是幫助我們解決類似問題的,即:能夠?qū)?基本數(shù)據(jù)類型 或者 對象 進(jìn)行序列化和反序列化操作!
2.對象處理流
2.1 概述
ObjectOutputStream 提供 序列化功能;
ObjectInputStream 提供 反序列化功能。
提供了對基本類型或者對象類型的序列化和反序列化方法。
類的繼承關(guān)系圖如下:
2.2 ObjectOutputStream案例
使用ObjectOutputStream序列化基本數(shù)據(jù)類型和一個Student對象(name,age),保存到data.dat文件中。
參考代碼與結(jié)果:
import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; /** * @author 興趣使然黃小黃 * @version 1.0 * 序列化基本數(shù)據(jù)類型和對象類型演示 */ public class ObjectOutputStreamTest { public static void main(String[] args) { //創(chuàng)建流對象 ObjectOutputStream objectOutputStream = null; try { objectOutputStream = new ObjectOutputStream(new FileOutputStream( "D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\data.dat")); //序列化后,保存的文件格式,不是純文本,而是按照它自己的格式存儲的 //序列化數(shù)據(jù) //int -> Integer(實現(xiàn)了 Serializable) objectOutputStream.writeInt(100); //boolean -> Boolean(實現(xiàn)了 Serializable) objectOutputStream.writeBoolean(true); //char -> Character objectOutputStream.writeChar('a'); //String objectOutputStream.writeUTF("黃小黃"); //保存一個Student對象 objectOutputStream.writeObject(new Student("黃小黃", 21)); System.out.println("數(shù)據(jù)序列化成功!"); } catch (IOException e) { e.printStackTrace(); } finally { //釋放資源 if(objectOutputStream != null) { try { objectOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } class Student implements Serializable{ private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } }
說明:
序列化基本數(shù)據(jù)類型的時候,會進(jìn)行自動裝箱。比如存儲int類型的100,則會以Integer的形式自動裝箱后存儲,因為Integer實現(xiàn)了Serializable接口。
2.3 ObjectInputStream案例
使用ObjectInputStream讀取data.dat的數(shù)據(jù),并反序列化恢復(fù)數(shù)據(jù)。
參考代碼與結(jié)果:
import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; /** * @author 興趣使然黃小黃 * @version 1.0 */ public class ObjectInputStreamTest { public static void main(String[] args) { //創(chuàng)建流對象 ObjectInputStream objectInputStream = null; try { objectInputStream = new ObjectInputStream(new FileInputStream( "D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\data.dat")); //讀取數(shù)據(jù) System.out.println(objectInputStream.readInt()); System.out.println(objectInputStream.readBoolean()); System.out.println(objectInputStream.readChar()); System.out.println(objectInputStream.readUTF()); System.out.println(objectInputStream.readObject()); //程序結(jié)束 System.out.println("反序列化完成!"); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { //釋放資源 if (objectInputStream != null){ try { objectInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
說明:
反序列化的順序一定要與序列化的順序一樣,否則,程序會拋出異常。
2.4 對象處理流的使用細(xì)節(jié)
1.讀寫順序一致,即序列化與反序列化的順序應(yīng)該一致;
2.要求實現(xiàn)序列化或者反序列化對象,需要實現(xiàn)Serializable接口;
3.序列化類中建議添加SerialVersionUID,為了提高版本兼容性;
4.序列化對象時,默認(rèn)將里面所有的屬性都進(jìn)行序列化,但static與transient修飾的成員除外;
5.序列化對象時,要求里面的屬性的類型也要實現(xiàn)序列化接口;
6.序列化具備可繼承性,也就是如果某類已經(jīng)實現(xiàn)了序列化,則它的所有子類也已經(jīng)默認(rèn)實現(xiàn)了序列化。
到此這篇關(guān)于Java文件操作之序列化與對象處理流詳解的文章就介紹到這了,更多相關(guān)Java序列化 對象處理流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Gson將字符串轉(zhuǎn)換成JsonObject和JsonArray
這篇文章主要介紹了使用Gson將字符串轉(zhuǎn)換成JsonObject和JsonArray,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02Java數(shù)據(jù)結(jié)構(gòu)之List的使用總結(jié)
List是Java中比較常用的集合類,指一系列存儲數(shù)據(jù)的接口和類,可以解決復(fù)雜的數(shù)據(jù)存儲問題,本文就來拿實際案例總結(jié)介紹一下List的使用方法,感興趣的朋友快來看看吧2021-11-11SpringMVC HttpMessageConverter報文信息轉(zhuǎn)換器
??HttpMessageConverter???,報文信息轉(zhuǎn)換器,將請求報文轉(zhuǎn)換為Java對象,或?qū)ava對象轉(zhuǎn)換為響應(yīng)報文。???HttpMessageConverter???提供了兩個注解和兩個類型:??@RequestBody,@ResponseBody???,??RequestEntity,ResponseEntity??2023-01-01Spring mvc服務(wù)端數(shù)據(jù)校驗實現(xiàn)流程詳解
這篇文章主要介紹了Spring mvc服務(wù)端數(shù)據(jù)校驗實現(xiàn)流程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09