首先解釋兩個(gè)概念,何為序列化?何為反序列化?
序列化:將對(duì)象轉(zhuǎn)化成流的過(guò)程稱為序列化
反序列化:將流轉(zhuǎn)化成對(duì)象的過(guò)程稱之為反序列化
序列化與反序列化必須遵守的原則
a) Java對(duì)象
在java中要想使一個(gè)java對(duì)象可以實(shí)現(xiàn)序列化與反序列化,必須讓該類實(shí)現(xiàn)java.io.Serializable接口
java.io.Serializable接口定義如下:
publicinterface Serializable { } |
從上述定義中可以看到該接口中未定義任何方法,這大大的簡(jiǎn)化了開(kāi)發(fā)者
b) 序列化主要依賴java.io.ObjectOutputStream類,該類對(duì)java.io.FileOutputStream進(jìn)一步做了封裝,這里主要使用ObjectOutputStream類的writeObject()方法實(shí)現(xiàn)序列化功能
Demo:
/** *將對(duì)象序列化到磁盤(pán)文件中 *@paramo *@throwsException */ publicstaticvoid writeObject(Object o) throws Exception{ File f=new File("d:""user.tmp"); if(f.exists()){ f.delete(); } FileOutputStream os=new FileOutputStream(f); //ObjectOutputStream 核心類 ObjectOutputStream oos=new ObjectOutputStream(os); oos.writeObject(o); oos.close(); os.close(); } |
c) 反序列化主要依賴java.io.ObjectInputStream類,該類對(duì)java.io.InputStream進(jìn)一步做了封裝,這里主要使用ObjectInputStream類的readObject()方法實(shí)現(xiàn)序列化功能
Demo:
/** *反序列化,將磁盤(pán)文件轉(zhuǎn)化為對(duì)象 *@paramf *@return *@throwsException */ publicstatic User readObject(File f) throws Exception{ InputStream is=new FileInputStream(f); //ObjectOutputStream 核心類 ObjectInputStream ois=new ObjectInputStream(is); return (User)ois.readObject(); } |
貼出完整的demo
Java對(duì)象:
package com.io.bean; import java.io.Serializable; publicclass User implements Serializable {
privateintuserId; private String userName; private String userSex; privateintuserAge; publicint getUserAge() { returnuserAge; } publicvoid setUserAge(int userAge) { this.userAge = userAge; } publicint getUserId() { returnuserId; } publicvoid setUserId(int userId) { this.userId = userId; } public String getUserName() { returnuserName; } publicvoid setUserName(String userName) { this.userName = userName; } public String getUserSex() { returnuserSex; } publicvoid setUserSex(String userSex) { this.userSex = userSex; } @Override public String toString() { returnthis.getUserId() + " " + this.getUserName() + " " + this.getUserSex() + " " + this.getUserAge(); } } |
序列化與反序列化
package com.io.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import com.io.bean.User; publicclass TestSerializable { /** *將對(duì)象序列化到磁盤(pán)文件中 *@paramo *@throwsException */ publicstaticvoid writeObject(Object o) throws Exception{ File f=new File("d:""user.tmp"); if(f.exists()){ f.delete(); } FileOutputStream os=new FileOutputStream(f); //ObjectOutputStream 核心類 ObjectOutputStream oos=new ObjectOutputStream(os); oos.writeObject(o); oos.close(); os.close(); }
/** *反序列化,將磁盤(pán)文件轉(zhuǎn)化為對(duì)象 *@paramf *@return *@throwsException */ publicstatic User readObject(File f) throws Exception{ InputStream is=new FileInputStream(f); //ObjectOutputStream 核心類 ObjectInputStream ois=new ObjectInputStream(is); return (User)ois.readObject(); }
publicstaticvoid main(String[] args) throws Exception{
/*****************將對(duì)象序列化***************/
/* User user=new User(); user.setUserId(1); user.setUserName("張藝謀"); user.setUserSex("男"); user.setUserAge(50); TestSerializable.writeObject(user); */
/*****************將對(duì)象序反列化***************/
User user=TestSerializable.readObject(new File("d:""user.tmp")); System.out.println(user); } } |