日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

IO对象流(序列化和反序列化)

發(fā)布時(shí)間:2024/8/23 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IO对象流(序列化和反序列化) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

序列化和反序列化概念:

序列化:

把堆內(nèi)存中的java對(duì)象數(shù)據(jù),通過某種方式把對(duì)象存儲(chǔ)到磁盤文件中或者傳遞給其他網(wǎng)絡(luò)的節(jié)點(diǎn)(在網(wǎng)絡(luò)上傳輸)

反序列化:

把磁盤文件中的對(duì)象數(shù)據(jù)或者網(wǎng)絡(luò)節(jié)點(diǎn)上的對(duì)象數(shù)據(jù),恢復(fù)成java對(duì)象的過程。


為什么要做序列化:
1):在分布式系統(tǒng)中,需要共享的數(shù)據(jù)的JavaBean對(duì)象,都得做序列化,此時(shí)需要把對(duì)象再網(wǎng)絡(luò)上傳輸,此時(shí)就得把對(duì)象數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制形式.
以后存儲(chǔ)在HttpSession中的對(duì)象,都應(yīng)該實(shí)現(xiàn)序列化接口(只有實(shí)現(xiàn)序列化接口的類,才能做序列化操作).
2):服務(wù)鈍化:如果服務(wù)發(fā)現(xiàn)某些對(duì)象好久都沒有活動(dòng)了,此時(shí)服務(wù)器就會(huì)把這些內(nèi)存中的對(duì)象,持久化在本地磁盤文件中(Java對(duì)象–>二進(jìn)制文件).
如果某些對(duì)象需要活動(dòng)的時(shí)候,現(xiàn)在內(nèi)存中去尋找,找到就使用,找不到再去磁盤文件中,反序列化我們得對(duì)象數(shù)據(jù),恢復(fù)成Java對(duì)象.

需要做序列化的對(duì)象的類,必須實(shí)現(xiàn)序列化接口:

java.io.Serializable接口(標(biāo)志接口[沒有抽象方法]).

底層會(huì)判斷,如果當(dāng)前對(duì)象是Serializable的實(shí)例,才允許做序列化. boolean ret = Java對(duì)象 instanceof Serializable;

在Java中大多數(shù)類都已經(jīng)實(shí)現(xiàn)Serializable接口.


使用對(duì)象流來完成序列化和反序列化操作:

ObjectOutputStream: 通過writeObject方法做序列化操作的.ObjectInputStream: 通過readObject方法做反序列化操作的.

注意:

Exception in thread "main" java.io.NotSerializableException: com.test.User表示User類沒有實(shí)現(xiàn)序列化接口,java.io.Serializable

序列化的細(xì)節(jié)序列化的版本:
1):如果某些數(shù)據(jù)不需要做序列化,比如密碼,此時(shí)怎么辦?
理論上說,靜態(tài)的字段和瞬態(tài)的字段是不能做序列化操作的.

transient public String Name; 2):序列化的版本問題反序列化Java對(duì)象時(shí)必須提供該對(duì)象的class文件,現(xiàn)在問題是,隨著項(xiàng)目的升級(jí),系統(tǒng)的class文件也會(huì)升級(jí)(增加一個(gè)字段/刪除一個(gè)字段),如何保證兩個(gè)class文件的兼容性? Java通過serialVersionUID(序列化版本號(hào))來判斷字節(jié)碼是否發(fā)生改變.

如果不顯示定義serialVersionUID類變量,該類變量的值由JVM根據(jù)類相關(guān)信息計(jì)算,而修改后的類的計(jì)算方式和之前往往不同.
從而造成了對(duì)象反序列化因?yàn)榘姹静患嫒荻〉膯栴}.

解決方案:在類中提供一個(gè)固定的serialVersionUID.

public static final long serialVersionUID=1L;

練習(xí)代碼:

package com.test;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; class User implements Serializable{public String Name;public int age;public String Sex;public User(String Name, int age, String Sex) {// TODO Auto-generated constructor stubthis.Name=Name;this.age=age;this.Sex=Sex;} } public class Main {public static void main(String[] args) throws Exception {File file = new File("file/obj.txt"); writeObject(file);readObject(file);} //反序列化操作 public static void readObject(File file) throws Exception, Exception {// TODO Auto-generated method stubObjectInputStream stream = new ObjectInputStream(new FileInputStream(file));User user =(User) stream.readObject();System.out.println(user.Name+"-"+user.age+"-"+user.Sex);stream.close();} //序列化操作public static void writeObject(File file) throws Exception, Exception {// TODO Auto-generated method stubObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream(file));stream.writeObject(new User("DreamZuora",23,"男"));stream.close();} }

總結(jié)

以上是生活随笔為你收集整理的IO对象流(序列化和反序列化)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。