java序列化流_java 序列化流與反序列化流

一 對象序列化流ObjectOutputStream

ObjectOutputStream 將Java對象的基本數據類型和圖形寫入OutputStream。可以使用ObjectInputStream

讀取(重構)對象。通過在流中使用文件可以實現對象的持久存儲。

注意:只能將支持 java.io.Serializable 接口的對象寫入流中

用于從流中讀取對象的

操作流 ObjectInputStream ???稱為 反序列化流

用于向流中寫入對象的操作流 ObjectOutputStream ??稱為 序列化流

特點:用于操作對象。可以將對象寫入到文件中,也可以從文件中讀取對象。

4d37a1a8c04055a747039aa6ae778a91.png

9e8fd7f217353e5ba923dcb311b5b340.png

public classObjectStreamDemo {public static void main(String[] args) throwsIOException, ClassNotFoundException {/** 將一個對象存儲到持久化(硬盤)的設備上。*/writeObj();//對象的序列化。

}public static void writeObj() throwsIOException {//1,明確存儲對象的文件。

FileOutputStream fos = new FileOutputStream("tempfile\\obj.object");//2,給操作文件對象加入寫入對象功能。

ObjectOutputStream oos = newObjectOutputStream(fos);//3,調用了寫入對象的方法。

oos.writeObject(new Person("wangcai",20));//關閉資源。

oos.close();

}

}

public class Person implementsSerializable {privateString name;private intage;publicPerson() {super();

}public Person(String name, intage) {super();this.name =name;this.age =age;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

@OverridepublicString toString() {return "Person [name=" + name + ", age=" + age + "]";

}

}

二?對象反序列化流ObjectInputStream

ObjectInputStream 對以前使用ObjectOutputStream寫入的基本數據和對象進行反序列化。支持

java.io.Serializable接口的對象才能從流讀取。

3414e96f548eaecff1b1063399f1c1d9.png

4a7eba9b07c9f9f2f97625c987271d2d.png

public classObjectStreamDemo {public static void main(String[] args) throwsIOException, ClassNotFoundException {

readObj();//對象的反序列化。

}public static void readObj() throwsIOException, ClassNotFoundException {//1,定義流對象關聯存儲了對象文件。

FileInputStream fis = new FileInputStream("tempfile\\obj.object");//2,建立用于讀取對象的功能對象。

ObjectInputStream ois = newObjectInputStream(fis);

Person obj=(Person)ois.readObject();

System.out.println(obj.toString());

}

}

三 序列化接口

當一個對象要能被序列化,這個對象所屬的類必須實現Serializable接口。否則會發生異常NotSerializableException

異常。

同時當反序列化對象時,如果對象所屬的class文件在序列化之后進行的修改,那么進行反序列化也會發生異常

InvalidClassException。發生這個異常的原因如下:

該類的序列版本號與從流中讀取的類描述符的版本號不匹配

該類包含未知數據類型

該類沒有可訪問的無參數構造方法

Serializable標記接口。該接口給需要序列化的類,提供了一個序列版本號。serialVersionUID.該版本號的目的在于

驗證序列化的對象和對應類是否版本匹配。

代碼修改如下,修改后再次寫入對象,讀取對象測試

public class Person implementsSerializable {//給類顯示聲明一個序列版本號。

private static final long serialVersionUID = 1L;privateString name;private intage;publicPerson() {super();

}public Person(String name, intage) {super();this.name =name;this.age =age;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

@OverridepublicString toString() {return "Person [name=" + name + ", age=" + age + "]";

}

}

四?瞬態關鍵字transient

當一個類的對象需要被序列化時,某些屬性不需要被序列化,這時不需要序列化的屬性可以使用關鍵字transient修飾。

只要被transient修飾了,序列化時這個屬性就不會序列化了。

同時靜態修飾也不會被序列化,因為序列化是把對象數據進行持久化存儲,而靜態的屬于類加載時的數據,不會被序列化。

代碼修改如下,修改后再次寫入對象,讀取對象測試

public class Person implementsSerializable {/** 給類顯示聲明一個序列版本號。*/

private static final long serialVersionUID = 1L;private staticString name;private transient/*瞬態*/ intage;publicPerson() {super();

}public Person(String name, intage) {super();this.name =name;this.age =age;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

@OverridepublicString toString() {return "Person [name=" + name + ", age=" + age + "]";

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539037.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539037.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539037.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【spring boot】注解@ApiParam @PathVariable @RequestParam三者區別

1.ApiParam,就是用于swagger提供開發者文檔,文檔中生成的注釋內容。 ApiOperation( value "編輯公告", notes "編輯公告", httpMethod "POST" )RequestMapping( value "/edit", method RequestMethod.POST…

Zookeeper Watch監聽

概述 ZooKeeper -server host:port cmd args stat path [watch] ls path [watch] ls2 path [watch] get path [watch] watch監聽有不同的類型,有監聽狀態的stat ,內容的get,目錄結構的ls。 命令使用一次,只監聽…

win10文件顯示后綴名_win10系統,如何去除“此電腦” 里的6個多余文件夾

Windows系統從XP到win7,再到進化到如今的win10,在系統性能和使用便捷性方面,確實改進了很多,但是,金無赤足,沒有完美的東西,總是有一些小細節讓我們感覺不舒服,如如鯁在喉。比如我們下面看到的這…

ubuntu sun-java6-jre_在 Ubuntu Lucid 下請回 Sun Java6 Jre, 趕走 OpenJDK

Ubuntu Lucid 將 sun-java6-jre 系列包移出了源,java軟件用 openjdk系列包提供支持。然而在某些軟件(比如FreeRapid)的使用中,openjdk還是喜歡出一些莫名其妙的錯誤(比如棧溢出),因此考慮請回sun-java6-jre。具體方法很簡單,首先添…

數字化工廠的五大系統_如何搭建以MES系統為核心的數字化工廠?

MES強調車間級的過程集成、控制和監控,以及合理地配置和組織所有資源。滿足車間信息化需要,提高車間對隨機事件的快速響應和處理能力,有力地促進企業信息化進程向車間層拓展。通過構建以“精益生產、智能制造”為特點的車間管理系統&#xff…

zookeeper數據結構及Znode類型

結構 1、層次化的目錄結構,命名符合常規文件系統規范 2、每個節點在zookeeper中叫做znode,并且其有一個唯一的路徑標識。 3、節點Znode可以包含數據和子節點(但是EPHEMERAL類型的節點不能有子節點)。 4、客戶端應用可以在節點上設置監視器…

Windows10下手工強制清理刪掉安裝版的JRE8導致java.exe無法運行的解決辦法

error:could not open xxxx.jvm.cfg 參考:https://blog.csdn.net/u010102493/article/details/18425267 1.搜索并刪掉C:\Windows\System32下:java*.exe 仍然不行: 在WIN10的開始菜單搜索java C:\ProgramData\Oracle\Java下還有一些東西。 確認…

設計企業網站大綱_企業網站設計布局

網站制作一年350元,五站合一,快速建站 ,www.sxjcwzjs.com,只需進入網站右上角注冊快速建站即可(需要電腦登錄注冊),需要聯系我吧!電話:13752214574,微信號:m1078582894企業網站布局很…

python畫子圖_Python使用add_subplot與subplot畫子圖操作示例

本文實例講述了Python使用add_subplot與subplot畫子圖操作。分享給大家供大家參考,具體如下:子圖:就是在一張figure里面生成多張子圖。Matplotlib對象簡介FigureCanvas 畫布Figure 圖Axes 坐標軸(實際畫圖的地方)注意&#…

vue導入靜態js_如何在vue js中加載靜態圖像

我有一個組件,它接受一個prop字符串,即一個url。它可以是遠程圖片,也可以是資產文件夾中的本地靜態資產。目錄結構:-assets/- logo.png-app.vue-components/-ImageTest.vue圖像測試.vue{{imagelink}}export default {name: "ImageTest",props:{imagelink: String,},c…

Zookeeper JavaApi 增刪改查

官網API http://zookeeper.apache.org/doc/r3.4.6/api/index.html JAR包 \zookeeper-3.3.6\lib\ jline-0.9.94.jar \zookeeper-3.3.6\lib\ log4j-1.2.15.jar \zookeeper-3.3.6\ zookeeper-3.3.6.jar Demo代碼 注意代碼中的注解 package hello.zookeeper.api;import java.uti…

搭建linux測試環境有什么用_談談現在搭建網站用什么程序好,選擇對的程序是很重要的開頭...

目前可以選擇的網站程序還是蠻多的,開源的系統也很多,也有很多精品。更多時候,選擇網站程序要結合網站的定位。說說dedecms,就是我們都知道的織夢程序,功能很齊全,作為一個簡單的資訊門戶網站,算…

python練習筆記——利用信號signal處理僵尸進程

1 signal處理僵尸進程的基于語法 利用信號signal處理僵尸進程的方法:signal(SIGCHLD,SIG_IGN),該方法也是第三種處理僵尸進程的方法。 SIGCHLD:子進程狀態改變后產生此信號,父進程需要調用一個wait函數以確定發生了什么。 1&#…

Zookeeper應用:服務端上下線

需求 客戶端感知服務器的上下線。 示意圖 步驟 服務端: 1、所有機子向Zookeeper注冊,注冊znode為臨時的。 2、有機子下線,連接斷開后被Zookeeper自動刪除,觸發監聽事件。 3、有機子上線,觸發監聽事件。 客戶端&am…

哈希表查找失敗的平均查找長度_你還應該知道的哈希沖突解決策略

本文首發于 vivo互聯網技術 微信公眾號 鏈接:https://mp.weixin.qq.com/s/5vxYoeARG1nC7Z0xTYXELA作者:Xuegui Chen哈希是一種通過對數據進行壓縮, 從而提高效率的一種解決方法,但由于哈希函數有限,數據增大等緣故,哈希…

hive 創建訪問用戶_hive創建角色并賦權

1 角色管理命令1.1 創建角色創建一個新角色,需要 admin 用戶執行CREATE ROLE role_name;1.2 刪除角色刪除一個角色,需要 admin 用戶執行DROP ROLE role_name;1.3 顯示當前角色顯示用戶當前角色列表SHOW CURRENT ROLES;1.4 設定角色如果指定了role_name&a…

python 正則替換_5分鐘速覽Python正則表達式常用函數!五分鐘就掌握它!

導讀:正則表達式是處理字符串類型的"核武器",不僅速度快,而且功能強大。本文不過多展開正則表達式相關語法,僅簡要介紹python中正則表達式常用函數及其使用方法,以作快速查詢瀏覽。01 Re概覽Re模塊是python的…

MFC鼠標OnMouseHover使用

ON_WM_MOUSEHOVER消息要生效,要配合ON_WM_MOUSEMOVE一起使用.代碼如下:void CYuButton::OnMouseMove(UINT nFlags, CPoint point) {// TODO: 在此添加消息處理程序代碼和/或調用默認值TRACKMOUSEEVENT tme { 0 };tme.cbSize sizeof(TRACKMOUSEEVENT);tme.dwFlags TME_HOVER…

oracle 分組_大數據分組怎樣才會更快

分組是數據庫的常見運算,無論數據如何準備,通常都需要將所有數據遍歷。建立索引這時是不起作用的,存儲格式才是決定遍歷效率的主要因素。數據庫中數據的存放雖然是二進制格式的,但普遍IO性能差,庫內遍歷快,…

java下拉樹_參數模板中下拉樹級聯下拉數據集查詢

背景說明在參數表單的制作中會遇到各種各樣的需求,如為了方便參數的輸入,需要將輸入框設計成樹狀;若參數模板中有兩個輸入框,每個輸入框對應的參數有某種關系,前一個輸入框輸入參數后,后一個輸入框自動關聯…