IO对象流(序列化和反序列化)
序列化和反序列化概念:
序列化:
把堆內(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)的字段是不能做序列化操作的.
如果不顯示定義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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断对象属性值是否为空
- 下一篇: dubbo启动服务启动报错.Unsati